SQL:如何使用仅代表一周中某些天的数据显示一周中的完整 7 天?

标签 sql sql-server select join group-by

我有一个表,用于存储一周中几天的数据。我想为一周中的每一天返回一行,即使我的表中一周中的那一天没有任何行。这是我当前的 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/

相关文章:

php - 选择周围的行 php/mysql

MYSQL 调用存储过程时出错

sql - MariaDB - 我可以手动添加 id 到 SELECT FROM() 吗?

php - 如何最小化我的查询?

sql-server - 如何删除 PK 列/键上的 ROWGUID 指定

javascript regexp,从某种类型的 url 中选择

java - 独立表之间的 Hibernate 左连接 - org.hibernate.hql.ast.QuerySyntaxException Path expected for join

java - Spring boot - 存储图像的最佳方式(SQL后端)

c# - int 和 string 之间的唯一索引

c - 如何处理socket服务器中select()引起的 "Bad file descriptor"?