我有一个表,用于存储一周中几天的数据。我想为一周中的每一天返回一行,即使我的表中一周中的那一天没有任何行。这是我当前的 sql select 语句。
SELECT StoreID,
CASE
WHEN S.[DayOfWeek] = 1 THEN 'Sunday'
WHEN S.[DayOfWeek] = 2 THEN 'Monday'
WHEN S.[DayOfWeek] = 3 THEN 'Tuesday'
WHEN S.[DayOfWeek] = 4 THEN 'Wednesday'
WHEN S.[DayOfWeek] = 5 THEN 'Thursday'
WHEN S.[DayOfWeek] = 6 THEN 'Friday'
WHEN S.[DayOfWeek] = 7 THEN 'Saturday'
ELSE 'BAD'
END AS [DayOfWeek],
isOpen
FROM MyTable S
WHERE StoreID = @I_StoreID
ORDER BY S.[DayOfWeek]
现在它只返回星期一和星期二的记录,因为表中只存在这些记录,但我希望它也返回其他行,即使当前没有它们的记录。谢谢!
编辑:
这是我的...
StoreID | DayOfWeek | isOpen
22 Sunday 0
22 Monday 1
29 Sunday 0
这是我希望得到的...
StoreID | DayOfWeek | isOpen
22 Sunday 0
22 Monday 1
22 Tuesday NULL
....
22 Saturday NULL
29 Sunday 1
29 Monday NULL
29 Tuesday NULL
....
29 Saturday NULL
最佳答案
您可以使用此解决方案:
SELECT
a.StoreID,
a.weekdayname,
b.isOpen
FROM
(
SELECT *
FROM
(
SELECT DISTINCT StoreID
FROM MyTable
) aa
CROSS JOIN
(
SELECT 1 AS weekdaynum, 'Sunday' AS weekdayname UNION ALL
SELECT 2, 'Monday' UNION ALL
SELECT 3, 'Tuesday' UNION ALL
SELECT 4, 'Wednesday' UNION ALL
SELECT 5, 'Thursday' UNION ALL
SELECT 6, 'Friday' UNION ALL
SELECT 7, 'Saturday'
) bb
) a
LEFT JOIN
MyTable b ON a.StoreID = b.StoreID AND
a.weekdaynum = b.[DayOfWeek]
WHERE
a.StoreID = @I_StoreID
ORDER BY
a.StoreID, a.weekdaynum
在这里,我们手动选择所有工作日名称并将它们CROSS JOIN
与每个不同的StoreID
。然后,我们将该选择的结果包装在 FROM
子句中,并在 StoreID
的条件下执行 LEFT JOIN
回到主表作为工作日数字匹配。如果不是,则 isOpen
字段将为 NULL
,但 StoreID
和相应的工作日仍会显示。
SQLFiddle Demo
关于SQL:如何使用仅代表一周中某些天的数据显示一周中的完整 7 天?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11714390/