【问题标题】:SQL Query - Dynamic Month Change based on Current DateSQL 查询 - 基于当前日期的动态月份变化
【发布时间】:2017-01-05 21:47:35
【问题描述】:

我在 SQL 中有这个表。 [Tbl_SALES]

+-------------+-----------+-------------+---------+-------+------+-------+
| Cust_Number |Code_Number| PartNumber  | UserID  | Month | Year | Sales |
+-------------+-----------+-------------+---------+-------+------+-------+
|     5535536 |       101 | AB11111     | Luis    | Aug   |   16 |   100 |
|     9256819 |       101 | AV11111     | Luis    | Aug   |   16 |   100 |
|     4369983 |       101 | AX11111     | Luis    | Aug   |   16 |   100 |
|     5535536 |       101 | AB11111     | Luis    | Sep   |   16 |   200 |
|     9256819 |       101 | AV11111     | Luis    | Sep   |   16 |   200 |
|     4369983 |       101 | AX11111     | Luis    | Sep   |   16 |   200 |
|     5535536 |       101 | AB11111     | Luis    | Oct   |   16 |   100 |
|     4369983 |       101 | AX11111     | Luis    | Oct   |   16 |   200 |
|     6441842 |       101 | AA11111     | Luis    | Oct   |   16 |   200 |
|     5535536 |       101 | AB11111     | Luis    | Nov   |   16 |   100 |
|     5535536 |       101 | AB11111     | Luis    | Dec   |   16 |   100 |
|     6441842 |       101 | AA11111     | Luis    | Dec   |   16 |   100 |
|     5535536 |       101 | AB11111     | Luis    | Jan   |   17 |   100 |
|     6441842 |       101 | AA11111     | Luis    | Jan   |   17 |   100 |
|     4369983 |       101 | AX11111     | Luis    | Feb   |   17 |   300 |
|     6441842 |       101 | AA11111     | Luis    | Feb   |   17 |   100 |
+-------------+-----------+-------------+---------+-------+------+-------+

我需要将 Month 行转换为 Columns。 我有这个 SQL 查询可以正确转置所有月份。

SELECT
[Cust_Number],
[Code_Number], 
[PartNumber], 
[UserID], 
SUM([Aug'16]) as [Aug'16],
SUM([Sep'16]) as [Sep'16],
SUM([Oct'16]) as [Oct'16],
SUM([Nov'16]) as [Nov'16],
SUM([Dec'16]) as [Dec'16],
SUM([Jan'17]) as [Jan'17],
SUM([Feb'17]) as [Feb'17],
SUM([Mar'17]) as [Mar'17],
SUM([Apr'17]) as [Apr'17],
SUM([May'17]) as [May'17],
SUM([Jun'17]) as [Jun'17],
SUM([Jul'17]) as [Jul'17]
FROM (
SELECT
[Cust_Number],
[Code_Number], 
[PartNumber], 
[UserID], 
case when  ([MONTH] = 'Aug') then SUM([SALES]) else Null end as [Aug'16],
case when  ([MONTH] = 'Sep') then SUM([SALES]) else Null end as [Sep'16],
case when  ([MONTH] = 'Oct') then SUM([SALES]) else Null end as [Oct'16],
case when  ([MONTH] = 'Nov') then SUM([SALES]) else Null end as [Nov'16],
case when  ([MONTH] = 'Dec') then SUM([SALES]) else Null end as [Dec'16],
case when  ([MONTH] = 'Jan') then SUM([SALES]) else Null end as [Jan'17],
case when  ([MONTH] = 'Feb') then SUM([SALES]) else Null end as [Feb'17],
case when  ([MONTH] = 'Mar') then SUM([SALES]) else Null end as [Mar'17],
case when  ([MONTH] = 'Apr') then SUM([SALES]) else Null end as [Apr'17],
case when  ([MONTH] = 'May') then SUM([SALES]) else Null end as [May'17],
case when  ([MONTH] = 'Jun') then SUM([SALES]) else Null end as [Jun'17],
case when  ([MONTH] = 'Jul') then SUM([SALES]) else Null end as [Jul'17]

FROM [Test].[dbo].[Tbl_SALES]
where [UserID] = 'Luis'
group by 
[Cust_Number],
[Code_Number], 
[PartNumber], 
[UserID], 
[MONTH]
) a
group by 
[Cust_Number],
[Code_Number], 
[PartNumber], 
[UserID]

查询结果。

+---------------+-------------+-------------+------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+----------+
| Cust_Name     | Code_Number | PartNumber  | User | Aug'16 | Sep'16 | Oct'16 | Nov'16 | Dec'16 | Jan'17 | Feb'17 | Mar'17 | Apr'17 | May'17 | Jun'17 | Jul'17 | |
+---------------+-------------+-------------+------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+----------+
|       5535536 |         101 | AB11111     | Luis |    100 |    200 |    100 |    100 |    100 |    100 |        |        |        |        |        |          |
|       9256819 |         101 | AV11111     | Luis |    100 |    200 |        |        |        |        |        |        |        |        |        |          |
|       4369983 |         101 | AX11111     | Luis |    100 |    200 |    200 |        |        |        |    300 |        |        |        |        |          |
|       6441842 |         101 | AA11111     | Luis |        |        |    200 |        |    100 |    100 |    100 |        |        |        |        |          |
+---------------+-------------+-------------+------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+----------+

考虑上一个查询...如何根据当前日期使此查询动态化? 比方说,今天是 2016 年 8 月 29 日,那么案例列表中的第一个月应该是 16 年 8 月,但是,您知道如何改进它并自动生成它,而不是我每个月都更改它吗?

【问题讨论】:

  • 你打算如何命名列?
  • 可能是从 M01 到 M12 ...
  • 如果您希望动态命名列,you'll need to use dynamic SQL。或者,您可以将归一化的分组数据返回给消费者,他们可以对数据进行透视。

标签: sql-server tsql dynamic getdate


【解决方案1】:

你需要的是Pivot Tables

它们支持动态列

更多示例: https://blogs.msdn.microsoft.com/spike/2009/03/03/pivot-tables-in-sql-server-a-simple-sample/

另请参阅此 SO 帖子。它显示了一个动态生成周数的示例,但您可以轻松地将其应用于月份: Convert Rows to columns using 'Pivot' in SQL Server

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2019-06-04
    • 2021-10-04
    • 1970-01-01
    • 2022-12-05
    相关资源
    最近更新 更多