2012-07-30 41 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列的一週,如果每一天商店當天是開放的。

相關問題