2013-03-07 8 views
43

Es gibt einen Tisch ‚tbl_transaction‘ mitCase-Anweisung in MySQL

id INT(11) Primary Key 
action_type ENUM('Expense', 'Income') 
action_heading VARCHAR (255) 
action_amount FLOAT 

Ist es möglich, nur SQL Query Auflistung aller Kosten Betrag in Expense Amt Spalte und Einkommensbetrag in Einkommen Amt Säule zu erhalten führen mit wie :

ID  Heading   Income Amt  Expense Amt 
1   ABC    1000    - 
2   XYZ    -    2000 

Ich benutze MySQL als Datenbank. Und ich versuche, CASE-Anweisung zu verwenden.

Prost!

+0

@Pradip: "Ich versuche, CASE-Anweisung zu verwenden." Wo ist das ? Posten Sie das auch. –

+0

SELECT *, CASE WHEN ACTION_TYPE 'Kosten' THEN = 'expense_amount' ELSE 'income_amount' END VON tbl_extra_income_expense –

+0

I expense_amount oder income_amount Zeichenfolge nur bin nicht Wert zu bekommen. –

Antwort

116

Ja, so etwas wie dieses:

SELECT 
    id, 
    action_heading, 
    CASE 
     WHEN action_type = 'Income' THEN action_amount 
     ELSE NULL 
    END AS income_amt, 
    CASE 
     WHEN action_type = 'Expense' THEN action_amount 
     ELSE NULL 
    END AS expense_amt 

FROM tbl_transaction; 

Wie andere Antworten haben darauf hingewiesen, MySQL hat auch die IF() funktionieren, um dies mit weniger verbaler Syntax zu tun. Im Allgemeinen versuche ich dies zu vermeiden, da es sich um eine MySQL-spezifische Erweiterung von SQL handelt, die anderswo normalerweise nicht unterstützt wird. CASE ist Standard-SQL und ist viel portabler über verschiedene Datenbank-Engines, und ich bevorzuge portable Abfragen so viel wie möglich zu schreiben, nur mit Engine-spezifischen Erweiterungen, wenn die portable Alternative erheblich langsamer oder weniger bequem ist.

+1

Ich bin überrascht, wie Sie in kurzer Zeit richtige Antwort liefern können .. Ich bin sehr dankbar! –

+7

Das sind wirklich einfache Sachen, die wir die ganze Zeit machen. – Barmar

8

Try IF(condition, value1, value2)

SELECT ID, HEADING, 
IF(action_type='Income',action_amount,0) as Income, 
IF(action_type='Expense',action_amount,0) as Expense 
+0

ya das funktioniert auch! Danke! –

2
verwenden

Diese Arbeit sollte:

select 
    id 
    ,action_heading 
    ,case when action_type='Income' then action_amount else 0 end 
    ,case when action_type='Expense' then expense_amount else 0 end 
from tbl_transaction 
19

MySQL hat auch IF():

SELECT 
    id, action_heading, 
     IF(action_type='Income',action_amount,0) income, 
     IF(action_type='Expense', action_amount, 0) expense 
FROM tbl_transaction 
1

Eine andere Sache im Auge zu behalten ist, gibt es zwei verschiedene Fälle mit MySQL: ein wie das, was @cdhowie und andere beschreiben hier (und dokumentiert hier: http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case) und etwas, das heißt CASE, hat aber völlig andere Syntax und völlig andere Funktion, hier dokumentiert: https://dev.mysql.com/doc/refman/5.0/en/case.html

Ausnahmsweise nutze ich zuerst eine, wenn ich die andere möchte.

0

Ich hoffe, das Sie mit der richtigen Lösung bieten würde:

Syntax:

CASE 
     WHEN search_condition THEN statement_list 
     [WHEN search_condition THEN statement_list].... 
     [ELSE statement_list] 
    END CASE 

Umsetzung:

select id, action_heading, 
    case when 
      action_type="Expense" then action_amount 
      else NULL 
      end as Expense_amt, 
    case when 
      action_type ="Income" then action_amount 
      else NULL 
      end as Income_amt 
    from tbl_transaction; 

Here I CASE Aussage verwenden, da es flexibler ist als if-then-else . Es erlaubt mehr als eine Verzweigung. Und CASE Anweisung ist Standard SQL und funktioniert in den meisten Datenbanken.