获取每月所有交易的总和,包括没有交易的月份

Posted

技术标签:

【中文标题】获取每月所有交易的总和,包括没有交易的月份【英文标题】:Get Sum Of All Transactions Per Month Including Months With No Transaction 【发布时间】:2015-10-30 05:33:42 【问题描述】:

为了简化表格结构,我将使用一个简单的表格示例。假设我有这张桌子:

+------+------------+-------------+
| id   | date       | Quantity    |
+------+------------+-------------+
|    1 | 2014-01-01 |          10 |
|    2 | 2014-01-20 |          20 |
|    3 | 2014-02-03 |          30 |
|    4 | 2014-02-28 |          40 |
|    5 | 2014-06-01 |          50 |
|    6 | 2014-06-13 |          24 |
|    7 | 2014-12-12 |          45 |
|    8 | 2014-12-18 |          10 |
+------+------------+-------------+ 

我需要每月获得Quantity 的总和,包括没有交易的月份

我已经尝试过了,但它只显示有交易的月份。

Select Month(date), Sum(Quantity) from tablename Group By Month(date)

不要介意年份。假设该表仅包含当年数据

【问题讨论】:

年份很重要。你只有一年的数据吗? 我知道。这就是为什么我说“让我们说吧” 【参考方案1】:

创建一个存储月份的虚拟表:

Select months.m, isnull(Sum(Quantity),0) as Q 
from tablename right join 
(VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)) 
AS months(m)
on months.m=Month(tablename.date)
Group By months.m

Here is a fiddle

【讨论】:

【参考方案2】:

这是一般的想法。关键是创建一个表列出您需要的月份,然后使用外部连接附加真实数据。

with months(mon) as (
    select  1 union all select  2 union all select  3 union all
    select  4 union all select  5 union all select  6 union all
    select  7 union all select  8 union all select  9 union all
    select 10 union all select 11 union all select 12
)
select m.mon, coalesce(sum(quantity), 0) as quantity
from months m left outer join <T> t on month(t.date) = m.mon
group by m.mon

如果您需要从 1 月到 12 月超过一年的数据,或者不喜欢这种方法,有很多方法可以创建月份列表。

【讨论】:

【参考方案3】:
With Months as
(
  SELECT 1 AS MNTH
  UNION ALL
  SELECT MNTH+1 FROM Months WHERE MNTH<12
)

SELECT MONTH(MNTH),SUM(QUANTITY) 
FROM Months M LEFT JOIN TABLENAME T ON M.MNTH = MONTH(T.DATE)
GROUP BY MONTH(MNTH)

【讨论】:

您不想按连接右侧的列进行分组,因为它可能为空。

以上是关于获取每月所有交易的总和,包括没有交易的月份的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode(数据库)- 每月交易II

sql 获取每月当前的年度总销售额

计算一个账户所有交易金额总和的有效方法

使用 VIEW 和 LEFT OUTER JOIN 进行慢查询

SQL:当某些月份没有记录时,如何查询每月总和的平均值?

LeetCode:Database 68.每月交易II