如何使用 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】:

在这种情况下您不需要使用子查询,您可以使用SUMCASE。此外,您的分组似乎对我返回 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 统计多字段 返回多字段

使用 WHERE、GROUP BY 和 ORDER BY

使用 group by 和 like 语句时如何让 SQL 使用 where 条件

having和group by的区别?

如何使用具有多个 GROUP BY、子查询和 WHERE IN 在大表上的查询来优化查询?

GROUP BY,WHERE,HAVING之间的区别和用法