SQL 按客户分组的最近 15 个月的销售额
Posted
技术标签:
【中文标题】SQL 按客户分组的最近 15 个月的销售额【英文标题】:SQL last 15 months of sales grouped by customer 【发布时间】:2019-03-05 03:06:20 【问题描述】:我想在 sql 中输出一个包含每个客户每月销售额的表。每列应对应另一个月份。
第一列应该是当前月份示例我的 sql 列是:
客户 发票日期 销售原来的表格是这样的:
+------------+------------+---------+
| Customer | invdate | sales |
+------------+------------+---------+
| Best Buy | 03-12-2019 | 433 |
| Walmart | 03-15-2019 | 543 |
| Home Depot | 12-12-2018 | 32 |
+------------+------------+---------+
期望的输出:
+------------+----------+--------+--------+--------+--------+----------+
| Customer | March 19 | Feb 19 | Jan 19 | Dec 18 | Nov 18 | Oct 18 |
+------------+----------+--------+--------+--------+--------+----------+
| Home Depot | 100 | 300 | 244 | 32 | 322 | 43 |
| Walmart | 543 | 222 | 234 | 12 | 234 | 34 |
| Bestbuy | 433 | 323 | 323 | 23 | 433 | 34 |
+------------+----------+--------+--------+--------+--------+----------+
【问题讨论】:
请发布您尝试过的内容 - 所以不是代码编写服务。 您可以在 SQL 中使用 PIVOT 执行此操作。按照下面的链接获取示例和帮助。[链接]***.com/questions/15931607/… Convert Rows to columns using 'Pivot' in SQL Server的可能重复 您好,您必须使用带有动态 sql 的 pivot 并执行,请参阅 Microsoft 文档并在分享您的查询后 这个输出是用什么工具渲染的?虽然动态 SQL 语句可以解决问题,但它也开始在 SQL 中引入数据格式;这通常更适合在显示/报告工具中执行。 【参考方案1】:您可以使用 group by、sum 和 case 来获得良好的效果,如下所示:
select
customer,
sum(case when year(invdate) = year(getdate) and month(invdate) = month(getdate()) then sales else o end),
sum(case when year(invdate) = year(dateadd(m,1,getdate))
and month(invdate) = month(dateadd(m,1,getdate())) then sales else o end),
sum(case when year(invdate) = year(dateadd(m,2,getdate))
and month(invdate) = month(dateadd(m,2,getdate())) then sales else o end),
sum(case when year(invdate) = year(dateadd(m,3,getdate))
and month(invdate) = month(dateadd(m,3,getdate())) then sales else o end),
sum(case when year(invdate) = year(dateadd(m,4,getdate))
and month(invdate) = month(dateadd(m,4,getdate())) then sales else o end),
sum(case when year(invdate) = year(dateadd(m,5,getdate))
and month(invdate) = month(dateadd(m,5,getdate())) then sales else o end)
from tableyoudidnotgivethenameof
group by customer
【讨论】:
这实际上工作得很好。我只需要更改 dateadd 以减去月份而不是添加它们。我唯一的另一个问题是我如何拥有动态列名,以显示当前月份、上个月等 拥有动态列名的唯一方法是使用动态 SQL。将上面的所有内容放在一个字符串中,并为您想要动态名称的位置添加一个AS YYYY
- 然后对结果字符串执行 exec。以上是关于SQL 按客户分组的最近 15 个月的销售额的主要内容,如果未能解决你的问题,请参考以下文章