如何使用 where 和 Group by 返回多个总和结果
Posted
技术标签:
【中文标题】如何使用 where 和 Group by 返回多个总和结果【英文标题】:How do I return multiple results of sum based using where and Group by 【发布时间】:2014-09-22 14:23:51 【问题描述】:我正在尝试执行一个查询,在该查询中我可以根据 where 子句获取列的总和,并按日期分组,但它的行为与我预期的不一样,也不知道为什么。
我有一张交易表:
时间戳(transaction_date) 一个值(金额), 一种类型(payin 或 payout), 交易前的过往余额(结转), 和期末余额(balance)。
这是我的表格的 JSON 导出:
[
"id":"2",
"type":"payout",
"carry":"2340",
"amount":"50",
"balance":"2290",
"transaction_date":"2014-09-15 00:00:00",
,
"id":"1",
"type":"payin",
"carry":"340",
"amount":"2000",
"balance":"2340",
"transaction_date":"2014-09-22 09:10:03",
,
"id":"3",
"type":"payout",
"carry":"0",
"amount":"50",
"balance":"0",
"transaction_date":"2014-09-22 09:10:03",
,
"id":"4",
"type":"payin",
"carry":"1",
"amount":"30",
"balance":"1",
"transaction_date":"2014-09-22 09:10:03",
]
我想要实现的是为每个日期(日历日期,而不是时间戳)获取一行,其中包含: 日期(又是日历而不是时间戳), 在任何一天交易之前进行初始携带, 该日期的付款总和, 该日期的支出总和, 当天的最终收盘余额。
目前我只得到一个结果,它似乎忽略了该组(无论行日期如何,都将所有付款和所有付款相加)
SELECT DATE(`transaction_date`) as day,
SUM(amount) AS pay_in
FROM transactions
WHERE type='payin' GROUP BY day
这是我正在使用的完整查询(减去进位和余额)
SELECT payins.day, payins.pay_in, payouts.pay_out
From
(SELECT DATE(`transaction_date`) as day,
SUM(amount) AS pay_in FROM transactions
WHERE type='payin' GROUP BY DATE(`transaction_date`)
) payins
LEFT JOIN
(SELECT DATE(`transaction_date`) as day, SUM(amount) AS pay_out
FROM transactions
WHERE type='payout'
GROUP BY DATE(`transaction_date`)
) payouts
ON payins.day = payouts.day
Group By day
如果有什么不同,我在 OSX 10.9 上使用 MAMP 3.0.4
【问题讨论】:
【参考方案1】:在这种情况下您不需要使用子查询,您可以使用SUM
和CASE
。此外,您的分组似乎对我返回 2 个示例数据结果的工作正常(请参阅提供的小提琴):
SELECT Date(transaction_date) date,
SUM(CASE WHEN type='payin' THEN amount END)) payinsum,
SUM(CASE WHEN type='payout' THEN amount END) payoutsum
FROM transactions
GROUP BY date
SQL Fiddle Demo
【讨论】:
以上是关于如何使用 where 和 Group by 返回多个总和结果的主要内容,如果未能解决你的问题,请参考以下文章
C# Linq to sql 实现 group by 统计多字段 返回多字段
使用 group by 和 like 语句时如何让 SQL 使用 where 条件