2012-07-30 55 views
1

我有一张表,用于存储一周中的几天的数据。即使在我的表中没有任何一周中的某一行,我也想为每周的每一天返回一行。这是我当前的sql select语句。SQL:我如何使用仅表示本周某几天的数据显示本周的全部7天内容?

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 
+1

我应该还给了那里并没有任何记录那些日子? – 2012-07-30 01:19:44

+0

我在想空值?也许这可能会造成问题,但我目前还没有想到。感谢您的问题:) – daveomcd 2012-07-30 01:20:17

+0

@ muistooshort是的先生! – daveomcd 2012-07-30 01:40:44

回答

2

您可以使用此解决方案:

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

0

编辑:我改变了这种在我看到您的更新回应之前。鉴于你想看到的数据,其他答案应该更好。

您是否拥有独立于拥有DayOfWeek的MyTable的表?如果在DayOfWeek = 1的整个表中没有单个记录,那么在开始使用MyTable之前,必须引入一个单独的DayOfWeek表以列出这些值。

这里有一个假设的DAYOFWEEK表和SQL将结果:

DAYOFWEEK表
工作日:名称
1:周日
2:周一
3:周二
4:周三
5:星期四
6:星期五
7:星期六

查询

SELECT D.Name, 
S.isOpen, 
COUNT(S.StoreID) as StoreID_Count 
FROM DayOfWeek D 
LEFT OUTER JOIN MyTable S ON S.DayOfWeek = D.DayOfWeek 
WHERE S.StoreID = @I_StoreID 
GROUP BY D.[DayOfWeek], S.isOpen 
ORDER BY D.[DayOfWeek] 

我相信这应该让你关闭至少是。

+0

不完全(我不认为)我用我的结果集编辑了我原来的帖子,我希望得到。也许现在问题更加清楚了,谢谢! – daveomcd 2012-07-30 01:32:47

1

如果ISOPEN是1开,0为关闭您也许能够做

select StoreID, 
    max(case when s.[DayOfWeek] = 1 then isOpen else 0 end) as Sunday, 
    max(case when s.[DayOfWeek] = 2 then isOpen else 0 end) as Monday, 
    max(case when s.[DayOfWeek] = 3 then isOpen else 0 end) as Tuesday, 
    max(case when s.[DayOfWeek] = 4 then isOpen else 0 end) as Wednesday, 
    max(case when s.[DayOfWeek] = 5 then isOpen else 0 end) as Thursday, 
    max(case when s.[DayOfWeek] = 6 then isOpen else 0 end) as Friday, 
    max(case when s.[DayOfWeek] = 7 then isOpen else 0 end) as Saturday 
from MyTable S 
where StoreID = @I_StoreID 
group by StoreID 

这将改变查询的格式,但应该给你1列的一周,如果每一天商店当天是开放的。

相关问题