2011-01-06 5 views
1

Je ces données dans ma table (tb_cash_transaction)MySQL avec 3 groupe par et somme

alt text

Je veux groupe la colonne TYPE, colonne CURRENCY_ID et colonne MONTANT il deviendra comme ci-dessous:

**Currency** **Cash IN** **Cash OUT** **Balance** 

14    40000  30000  10000   
15    50000  40000  10000 

règle:

1.Group par devise
2.Puis trouver la somme d'argent pour cela dans monnaie
3.Repérez la somme d'argent pour cette monnaie
4.Get le solde (somme trésorerie - somme cash out)

Comment y parvenir en utilisant MySQL? J'essaye d'employer le groupe par mais ne peux pas obtenir la sortie désirée.

Merci à l'avance

Répondre

4
SELECT currency_id, 
     SUM(CASE 
      WHEN TYPE = 'cash_in' THEN amount 
      END) AS cash_in, 
     SUM(CASE 
      WHEN TYPE = 'cash_out' THEN amount 
      END) AS cash_out, 
     SUM(CASE 
      WHEN TYPE = 'cash_in' THEN amount 
      ELSE -amount 
      END) AS balance 
FROM tb_cash_transaction 
WHERE TYPE IN ('cash_in', 'cash_out') /*<--- Where clause probably not needed 
             but just in case there are other options*/ 
GROUP BY currency_id 
+0

cette requête fonctionne bien et beaucoup plus simple. merci :) – cyberfly

+0

@cyberfly - Il fait juste un passage à travers les données, donc j'aurais pensé qu'il devrait être plus efficace que l'approche auto-jointure. –

+0

salut martin, je me demande comment ajouter la restriction datetime au montant de la somme? et aussi le rejoindre le currency_id pour obtenir le nom de la devise. Merci encore. – cyberfly

0

Essayez ceci:

SELECT a.currency_id, cash_in, cash_out, (cash_in - cash_out) balance 
    FROM (
       SELECT currency_id, SUM(AMOUNT) cash_in 
        FROM tb_cash_transaction 
       WHERE type = 'cash_in' 
       GROUP BY currency_id 
       ) a, 
       (
       SELECT currency_id, SUM(AMOUNT) cash_out 
        FROM tb_cash_transaction 
       WHERE type = 'cash_out' 
       GROUP BY currency_id 
       ) b 
    WHERE a.currency_id = b.currency_id 
+0

Salut merci, vous m'avez sauvé la vie. l'erreur de retour de code ci-dessus erreur ambigieuse, mais j'ai juste besoin de changer le nom de la colonne. merci encore :) – cyberfly

+0

Vous l'auriez eu avec la version précédente, j'ai renommé la deuxième colonne dans la requête b à cash_out. Cela devrait fonctionner correctement maintenant. Essayez-le maintenant. – Chandu

0
select currency_id, cashin "Cash In", cashout "Cash Out", 
cashin-cashout "Balance" from (
    select currency_id, sum(if(type='cash_in',amount,0)) as cashin, 
    sum(if(type='cash_out',amount,0)) as cashout, 
    from tb_cash_transaction group by currency_id 
) 
0

Voici la solution que je l'utilise. Merci à cybernate pour son code.

SELECT a.currency_id, cashin, cashout, (cashin - cashout) balance 
FROM (
      SELECT currency_id, SUM(AMOUNT) cashin 
      FROM tb_cash_transaction 
      WHERE type = 'cash_in' 
      GROUP BY currency_id 
      ) a, 
      (
      SELECT currency_id, SUM(AMOUNT) cashout 
      FROM tb_cash_transaction 
      WHERE type = 'cash_out' 
      GROUP BY currency_id 
      ) b 
WHERE a.currency_id = b.currency_id