2011-01-06 7 views
1

Ich habe diese Daten in meinem Tisch (tb_cash_transaction)mysql mit 3 Gruppe und Summe

alt text

ich gruppieren möchten die Spalte TYPE, currency_id Spalte und Spalte Betrag, so dass es wie unten werden wird:

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

14    40000  30000  10000   
15    50000  40000  10000 

Regel:

1.Group nach Währungen
2.Then die Summe von Bargeld finden in für das Währung
3.Symbol für die Anwendung Summe Bargeld aus dieser Währung
4.Get der Waage (Summe Bargeld in - Summe Bargeld aus)

Wie es mysql erreichen? Ich versuche, die Gruppe zu verwenden, kann aber nicht die gewünschte Ausgabe erhalten.

Vielen Dank im Voraus

Antwort

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

Diese Abfrage funktioniert gut und viel einfacher. Danke :) – cyberfly

+0

@cyberfly - Es macht nur einen Durchgang durch die Daten, so hätte ich gedacht, dass es effizienter sein sollte als die Selbst beitreten Ansatz. –

+0

hallo martin, ich frage mich, wie man die datetime restriktion auf die summe addieren? und auch die Währung_ID, um den Währungsnamen zu erhalten. Danke noch einmal. – cyberfly

0

Try this:

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

hallo danke du hast mein leben gerettet. Der obige Code gibt einen mehrdeutigen Fehler zurück, aber ich muss nur einen Spaltennamen ändern. Nochmals vielen Dank :) – cyberfly

+0

Sie hätten es mit der vorherigen Version, ich habe die zweite Spalte in Abfrage b in Cash_out umbenannt. Es sollte jetzt gut funktionieren. Probieren Sie es jetzt. – 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

Hier ist die Lösung, die ich verwende. Danke an cybernate für seinen 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