2011-07-18 79 views
2

我有一个事务表和一个标记表。我想获得按标记分组的交易表中所有交易的总和。有两种不同类型的交易:“预算”和“实际”组合两个由同一列分组的GROUP BY查询

这个查询将返回我什么,我想为“预算”的交易:

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 

我的问题:我怎么组这两个查询的结果,成一个,所以我得到一个结果表有三列:标签,budgetTotal和actualTotal?

回答

3

试试这个:

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

不它需要是'SUM(CASE WHITE tx.type =“actual”THEN amount END)AS actualTotal,'和分别代表'budgetTotal'?我的意思是,当你使用GROUP BY而不使用聚合(在这种情况下为SUM)时,你不应该引用'tx.type'。 –

+0

在查询中,如果您在列上使用总数或计数或任何函数,则必须在所有列上执行[group by],不管您是否使用 ,如select a,b,c,sum(a),sum(b )从x group by a,b,c – Shahzeb

+1

@Mitch:但是你的回答是正确的(@ rsbarro's也是这样),而这会在2'Total'列中显示错误的结果。它将随机地显示“SUM(金额)”(在所有行上,而不仅仅是“实际”或“预算”)或“NULL”。 –

1
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

不是瞧不起对方的回答(这可能是更好的),但这里是如何得到它作为两个单独的行是否适合。此外,这个答案是可扩展到任意数量的tx.type不改变查询(如果去掉标准路线的where子句中t.type):

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; 
+0

一个好的解决方案,但难以迭代为我的目的(对AJAX调用的JSON响应) – Ben