Объединение двух запросов GROUP BY, сгруппированных по одному столбцу - PullRequest
2 голосов
/ 18 июля 2011

У меня есть таблица транзакций и таблица тегов. Я хочу получить сумму всех транзакций в таблице транзакций, сгруппированных по тегам. Существует два типа транзакции: «бюджет» и «факт»

Этот запрос вернет мне то, что я хочу для «бюджетных» транзакций:

  SELECT tg.name as tag, SUM(amount) as budgetTotal 
    FROM transaction tx
    JOIN transaction_tag tt ON tt.transaction_id = tx.id
    JOIN tag tg ON tg.id = tt.tag_id
   WHERE tx.type = "budget"
     AND tx.date >= '2011-07-15' 
     AND tx.date < '2011-08-15'
GROUP BY tg.name

И, конечно, почти такой же запрос для «реальных» транзакций:

  SELECT tg.name as tag, SUM(amount) as actualTotal 
    FROM transaction tx
    JOIN transaction_tag tt ON tt.transaction_id = tx.id
    JOIN tag tg ON tg.id = tt.tag_id
   WHERE tx.type = "actual"
     AND tx.date >= '2011-07-15' 
     AND tx.date < '2011-08-15'
GROUP BY tg.name

Мой вопрос: как сгруппировать результаты этих двух запросов в один, чтобы я получил одну таблицу результатов с тремя столбцами: tag, budgetTotal и actualTotal?

Ответы [ 3 ]

3 голосов
/ 18 июля 2011

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

  SELECT tg.name, 
         CASE WHEN tx.type = "actual" THEN SUM(amount) END AS actualTotal,
         CASE WHEN tx.type = "budget" THEN SUM(amount) END AS budgetTotal
  FROM....
  WHERE  tx.type IN ("actual", "budget")
  AND   ....
  GROUP BY tg.name
1 голос
/ 18 июля 2011
SELECT tg.name as tag, SUM(amount) as budgetTotal, 'budget' as rectype
FROM transaction tx
JOIN transaction_tag tt ON tt.transaction_id = tx.id
JOIN tag tg ON tg.id = tt.tag_id
WHERE tx.type = "budget"
AND tx.date >= '2011-07-15' 
AND tx.date < '2011-08-15'
GROUP BY tg.name

UNION ALL

SELECT tg.name as tag, SUM(amount) as actualTotal, , 'actual' as rectype
FROM transaction tx
JOIN transaction_tag tt ON tt.transaction_id = tx.id
JOIN tag tg ON tg.id = tt.tag_id
WHERE tx.type = "actual"
AND tx.date >= '2011-07-15' 
AND tx.date < '2011-08-15'
GROUP BY tg.name
0 голосов
/ 18 июля 2011

Не исключая другой ответ (что, вероятно, лучше), но вот как получить его в виде двух отдельных строк, если это подходит.Кроме того, этот ответ масштабируется до любого числа tx.type без изменения запроса (если вы, конечно, удалите ссылку на t.type в предложении where):

SELECT tg.name as tag, tx.type, SUM(amount) as total
    FROM transaction tx
    JOIN transaction_tag tt ON tt.transaction_id = tx.id
    JOIN tag tg ON tg.id = tt.tag_id
   WHERE tx.date >= '2011-07-15' 
     AND tx.date < '2011-08-15'
     AND tx.type in ("budget", "actual")
GROUP BY tg.name, tx.type;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...