SQL - где условие для каждого столбца - PullRequest
1 голос
/ 23 мая 2011

Это общий вопрос SQL, но я, если вы должны знать, что база данных - Firebird.

У меня есть эта таблица (упрощенно):

<b>user  amount  type</b>
--------------------
john  25      credit
john  20      debit
john  5       debit
john  15      credit
mike  15      credit

Я хочу получить результатэто выглядит так, используя один запрос:

<b>user  credit  debit</b>
--------------------
john  40      25
mike  15      NULL
Where credit = SUM(amount) WHERE type=credit
   and debit = SUM(amount) WHERE type=debit

В основном я хочу иметь несколько полей в результате на основе суммы поля (в данном случае суммы), но при других условиях (в этом случае введите).

Заранее благодарим за любые предложения.

Ответы [ 3 ]

6 голосов
/ 23 мая 2011

Стандартный SQL будет:

SELECT "user",
    SUM(CASE WHEN type='credit' then amount END) as Credit,
    SUM(CASE WHEN type='debit' then amount END) as Debit
FROM
    "table"
GROUP BY
    "user"
2 голосов
/ 23 мая 2011

Я не уверен, как Firebird это делает, но вы можете сделать что-то вроде:

SELECT user, 
sum(SELECT amount FROM table AS t2 WHERE t2.user = t1.user AND type="credit" ) AS credit, 
sum(SELECT amount FROM table AS t3 WHERE t3.user = t1.user AND type="debit" ) AS debit
FROM table AS t1
GROUP BY user
ORDER BY user

Я ссылаюсь на то, что, по моему мнению, будет в PostgreSQL, на случай, если это поможет вам найти то, что вам нужно.

0 голосов
/ 23 мая 2011

попробуйте это:

SELECT credit.user_name, credit.cre, debit.deb
  FROM (SELECT user_name, SUM(amount) cre FROM t WHERE TYPE = 'credit' GROUP BY user_name) credit
  LEFT OUTER JOIN (SELECT user_name, SUM(amount) deb
                     FROM t
                    WHERE TYPE = 'debit'
                    GROUP BY user_name) debit
    ON (credit.user_name = debit.user_name)
...