获取每月所有交易的总和,包括没有交易的月份
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)
【讨论】:
您不想按连接右侧的列进行分组,因为它可能为空。以上是关于获取每月所有交易的总和,包括没有交易的月份的主要内容,如果未能解决你的问题,请参考以下文章