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 个月的销售额的主要内容,如果未能解决你的问题,请参考以下文章

php+mysql中怎么查询最近12个月每个月的数据

s-s-rS 分组总和问题

如何从当前日期 PHP 获取最近 7 周、7 个月的日期范围?

Power BI:需要计算最近 3 个月的 MTD 销售额

按月分组的运行计数以汇总销售额

如何用sql的日期函数,分别查出1月~12月每个月的销售金额?