2013-03-07 2 views
43

Существует таблица «tbl_transaction» сДела в MySQL

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

Можно ли получить результат, используя только SQL запросов перечисления всех суммы расходов в Затрат Amt колонки и сумме дохода в доходе Amt колонке, как :

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

Я использую MySQL как базу данных. И я пытаюсь использовать оператор CASE.

Cheers!

+0

@Pradip: «Я пытаюсь использовать оператор CASE». Где это ? Отправьте это тоже. –

+0

SELECT *, CASE WHEN action_type = 'Expense' THEN 'cost_amount' ELSE 'income_amount' END FROM tbl_extra_income_expense –

+0

Я просто получаю string_account или value_amount, но не значение. –

ответ

116

Да, что-то вроде этого:

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; 

Как и другие ответы указали, MySQL также имеет IF(), чтобы сделать это, используя более подробный синтаксис. Обычно я стараюсь избегать этого, потому что это SQL-специфическое расширение для SQL, которое обычно не поддерживается в других местах. CASE является стандартным SQL и гораздо более переносимым в разных механизмах баз данных, и я предпочитаю писать переносные запросы как можно больше, только с использованием расширений, специфичных для двигателя, когда переносная альтернатива значительно медленнее или менее удобно.

+1

Я удивлен, как вы, ребята, можете дать правильный ответ за короткое время. Я очень благодарен! –

+7

Это действительно простой материал, который мы делаем все время. – Barmar

8

Попробуйте использовать 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 это тоже работает! Спасибо! –

2

Это должно работать:

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 также 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

Другое дело, иметь в виду, есть два различных МИОНы с MySQL: один как то, что @cdhowie и другие описывают здесь (и документированы здесь: http://dev.mysql.com/doc/refman/5.7/en/control-flow-functions.html#operator_case) и то, что называется CASE, но имеет совершенно другой синтаксис и совершенно другую функцию, описанную здесь: https://dev.mysql.com/doc/refman/5.0/en/case.html

Неизменно, сначала я использую его, когда хочу другой.

0

Я надеюсь, что это даст вам правильное решение:

Синтаксис:

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

Реализация:

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; 

Здесь я использую CASE заявление, поскольку это более гибкий, чем if-then-else , Он позволяет использовать несколько ветвей. Оператор CASE является стандартным SQL и работает в большинстве баз данных.