2009-06-05 58 views
1

我想要計算沒有與它們關聯的事件的當前周的天數,但我不知道如何去做。如何在沒有行時計算這個值?

例如,我計算事件在本週發生的與此查詢的號碼:

SELECT COUNT(e.event_id) FROM cali_events e 
LEFT JOIN cali_dates d 
ON e.event_id = d.event_id 
WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) 

但我只知道如何通過計算每個人每天總結返回0天的天數,但這不是很優雅。

我該如何處理一個查詢?

+0

加入該團體,您可以將您的DDL和樣本數據插入語句? – 2009-06-05 19:23:34

回答

10

此查詢使用子查詢來查找連接表中的所有唯一日期。那麼從七個中減去唯一日期的數量?

--assuming a 7 day week; no mention in the request about workweek. 
     SELECT 7 - COUNT(*) AS NumDaysWithoutEvents 
     FROM  
     (SELECT DAY(d.date) 
      FROM cali_events e 
      LEFT JOIN cali_dates d 
      ON e.event_id = d.event_id 
      WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) 
      GROUP BY DAY(d.date) 
     ) AS UniqueDates 
+0

返回的10 6 ...有7個事件,3天沒有事件。 – Malfist 2009-06-05 19:16:04

+0

現在我得到-3的一行! – Malfist 2009-06-05 19:19:50

+0

這是一個DATETIME,所以按d.date分組是無用的,即使它們在同一天也有不同的時間分配給它們。 – Malfist 2009-06-05 19:24:38

1

對於那些'價值表'之一,您可能會創建一個可能的日/周/表,然後加入那些不匹配&的表。

-1

所以你有一個日期表和一個事件表?

如果發生事件,會在日期表中顯示event_id嗎?

如果是這樣,你不能只是做一個INNER JOIN嗎?

1

難道你不能寫你查詢來找到你感興趣的時間框架內有一個事件的不同日期嗎?

0

我認爲這將起作用,但我也認爲有一個解決方案使用HAVING。

SELECT COUNT(*) FROM 
    (SELECT d.date, count(*) as event_count 
    FROM cali_dates d 
     LEFT JOIN cali_events e ON d.event_id = e.event_id 
    WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) 
    GROUP BY d.date) t 
WHERE t.event_count = 0 

編輯添加:這裏假設沒有時間部分在d.date中,雖然它很容易適應。它還假定cali_dates包含一週中每一天的記錄。

+0

返回0,應該返回3 – Malfist 2009-06-05 19:21:16

0

翻轉過來,查詢,如果在cali_events存在的事項標識中沒有記錄從cali_dates選擇:

select count(*) 
    from cali_dates d 
where not exists(select * 
        from cali_events e 
        where d.event_id = e.event_id) 
    and YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) 
+0

返回0,應該返回3。 – Malfist 2009-06-05 19:20:34

0

假設你Cali_Dates表對於每天在週中的一行:

從Cali_Dates表,它是當前星期,查找Cali_Events表中所有具有空值(無事件)的行。

SELECT sum(case when e.event_id is null then 1 else 0 end) 
FROM cali_dates d 
LEFT JOIN cali_events e 
ON e.event_id = d.event_id 
WHERE YEARWEEK(d.date) = YEARWEEK(CURRENT_DATE()) 
GROUP BY d.date 

否則,你就必須在pcambell的回答申報的天數在本週,如:

編輯:忘記通過