sql - 具有不同日期的列到行
问题描述
请参阅下面的示例数据和所需的输出格式:
--SAMPLE TABLE
DECLARE @TEMP TABLE(
DATA_DATE DATE,
PROD_ID INT,
CAT_CODE NVARCHAR(10),
DATABUCKET_1 FLOAT,
DATABUCKET_2 FLOAT,
DATABUCKET_3 FLOAT,
DATABUCKET_4 FLOAT,
DATABUCKET_5 FLOAT);
INSERT INTO @TEMP VALUES('19-Oct-2018',100,'C1', 100,200,300,400,500)
SELECT * FROM @TEMP;
--PREFERRED OUTPUT FORMAT
SELECT 'C1' AS CAT_CODE, '19-Oct-2018' AS DATA_DATE, 100 AS UNITS, 'W1' AS WEEK_NUM--FOR DATABUCKET_1, THE DATE REMAINS SAME (AS DATA_DATE)
UNION ALL
SELECT 'C1' AS CAT_CODE, '12-Oct-2018' AS DATA_DATE, 200 AS UNITS, 'W2' AS WEEK_NUM--FOR DATABUCKET_2, THE DATE IS ONE WEEK BEFORE THAT OF W1
UNION ALL
SELECT 'C1' AS CAT_CODE, '05-Oct-2018' AS DATA_DATE, 300 AS UNITS, 'W3' AS WEEK_NUM--FOR DATABUCKET_3, THE DATE IS ONE WEEK BEFORE THAT OF W2
UNION ALL
SELECT 'C1' AS CAT_CODE, '28-Sep-2018' AS DATA_DATE, 400 AS UNITS, 'W4' AS WEEK_NUM--FOR DATABUCKET_4, THE DATE IS ONE WEEK BEFORE THAT OF W3
UNION ALL
SELECT 'C1' AS CAT_CODE, '21-Sep-2018' AS DATA_DATE, 500 AS UNITS, 'W5' AS WEEK_NUM--FOR DATABUCKET_5, THE DATE IS ONE WEEK BEFORE THAT OF W4
补充几点:
- 我的实际表有 106 个数据桶和其他几列。
- 为了简单起见,我在这里只给出了一些。
- 每个月都会收到一个具有不同 DATA_DATE 值的新文件。
- DATA_DATE 值在一个文件中是相同的,它对应于 DATABUCKET_1
- 对于其他 DATABUCKETS,该值是一周前。
请让我知道如何使用 UNPIVOT 实现这一目标。提前致谢
解决方案
你可以un-pivot
使用CROSS APPLY
SELECT t.CAT_CODE, d.*
FROM @TEMP t
CROSS APPLY
(
SELECT DATA_DATE = t.DATA_DATE, UNITS = t.DATABUCKET_1, WEEK_NUM = 'W1' union all
SELECT DATA_DATE = DATEADD(DAY, -7, t.DATA_DATE), UNITS = t.DATABUCKET_2, WEEK_NUM = 'W2' union all
SELECT DATA_DATE = DATEADD(DAY, -14, t.DATA_DATE), UNITS = t.DATABUCKET_3, WEEK_NUM = 'W3' union all
SELECT DATA_DATE = DATEADD(DAY, -21, t.DATA_DATE), UNITS = t.DATABUCKET_4, WEEK_NUM = 'W4' union all
SELECT DATA_DATE = DATEADD(DAY, -28, t.DATA_DATE), UNITS = t.DATABUCKET_5, WEEK_NUM = 'W5'
) d
或使用计数/数字表
SELECT t.CAT_CODE, DATA_DATE = DATEADD(DAY, -7 * n, t.DATA_DATE),
UNITS = CASE n
WHEN 0 THEN t.DATABUCKET_1
WHEN 1 THEN t.DATABUCKET_2
WHEN 2 THEN t.DATABUCKET_3
WHEN 3 THEN t.DATABUCKET_4
WHEN 4 THEN t.DATABUCKET_5
END,
WEEK_NUM = 'W' + CONVERT(VARCHAR(10), n + 1)
FROM @TEMP t
INNER JOIN NUMBERS n ON n between 0 and 4
如果你真的有 106 个桶,你真的应该考虑标准化你的表。否则,您需要对 106 行重复上述操作。另一种方法是使用Dynamic SQL
来处理
推荐阅读
- xcode - SwiftUI Preview 中的深色模式在 Xcode 11.4 中没有深色背景
- mysql - 在 MYSQL 中找出给定日期范围内的房间可用性
- node.js - 在为亚马逊 alexa 构建自定义技能时遇到错误
- java - 使用 @CsvBindAndSplitByPosition 读取 csv 文件
- javascript - 如何在 MVC C# 中使用 MvcHtmlString 创建警报确认是/否
- python - pymongo.errors.ServerSelectionTimeoutError: localhost:27017: [Errno 111] Connection denied django to heroku
- sql - 关系代数把东西算作重命名
- ietf-netmod-yang - 在 yang 文件中调用“C”函数
- c# - 如何调用三个独立类的方法?
- wordpress - 对于多站点 Wordpress,如何将所有 URL 重定向到 www,仅将特定 URL 重定向到 https