我有一个表格(DLVERYDAY(,一周中的每一天都有一列。如果客户将交货日期分配给某一天,则该天的列将设置为"Y"。我想将七天合并到一列中,例如"交货日",如果星期日列为"Y",则在交货日下,每个客户将显示为"星期日"。
我尝试与工会一起解决这个问题,但我就是无法得到我需要的东西。 第一次比较(与星期日比较时(始终显示为 NULL。 如果那天不是交货日或设置为 N,我不希望出现空值。
dbo.DLVERYDAY
ID Location Name WH Sun Mon Tue Wed Thu Fri Sat
0000000 CUSTOMER1|LOCATION1 DO N N Y N N N Y
0000001 CUSTOMER2|LOCATION2 DO N Y N N N Y N
SELECT CUST_ID, CUSLOC_ID, CUSLOC_NAM, WH,
(CASE WHEN DAY1 LIKE 'Y' THEN 'Sunday'END) AS 'Delivery Day'
FROM dbo.DLVERYDAY WHERE CUSLOC_ID = '0000000' OR CUSLOC_ID = '0000001'
UNION
SELECT CUST_ID, CUSLOC_ID, CUSLOC_NAM, WH,
(CASE WHEN DAY2 = 'Y' THEN 'MONDAY' END) AS 'Delivery Day'
FROM dbo.DLVERYDAY WHERE CUSLOC_ID = '0000000' OR CUSLOC_ID = '0000001'
UNION
SELECT CUST_ID, CUSLOC_ID, CUSLOC_NAM, WH,
(CASE WHEN DAY3 = 'Y' THEN 'TUESDAY' END) AS 'Delivery Day'
FROM dbo.DLVERYDAY WHERE CUSLOC_ID = '0000000' OR CUSLOC_ID = '0000001'
AND SO ON....
两个客户有多个交货日的示例。
Actual Result:
ID Location Name WH Delivery Day
0000000 CUSTOMER1|LOCATION1 DO NULL
0000000 CUSTOMER1|LOCATION1 DO SATURDAY
0000000 CUSTOMER1|LOCATION1 DO TUESDAY
0000001 CUSTOMER2|LOCATION2 DO NULL
0000001 CUSTOMER2|LOCATION2 DO MONDAY
0000001 CUSTOMER2|LOCATION2 DO THURSDAY
Expected Result:
ID Location Name WH Delivery Day
0000000
CUSTOMER1|LOCATION1 DO Tuesday
0000000
CUSTOMER1|LOCATION1 DO Saturday
0000001
CUSTOMER2|LOCATION2 DO Monday
0000001
CUSTOMER2|LOCATION2 DO Friday
您可以使用 WHERE 子句代替 Case 语句。WHERE 子句将筛选出将为 NULL 的记录。这是周一和周二的示例,您可以重复并继续获取所有 7 天。这是最容易理解的答案。
SELECT CUST_ID
, CUSLOC_ID
, CUSLOC_NAM
, WH
, 'Monday' AS 'Delivery Day'
FROM dbo.DLVERYDAY
WHERE (CUSLOC_ID = '0000000' OR CUSLOC_ID = '0000001')
AND Day1 = 'Y'
UNION ALL
SELECT CUST_ID
, CUSLOC_ID
, CUSLOC_NAM
, WH
, 'Tuesday' AS 'Delivery Day'
FROM dbo.DLVERYDAY
WHERE (CUSLOC_ID = '0000000' OR CUSLOC_ID = '0000001')
AND Day2 = 'Y'
可能涵盖您尚未接触到的 SQL 主题的更复杂的解决方案是使用 UNPIVOT 函数。
这是有关UNPIVOT功能的文章的链接。这将帮助您规范化数据。