2013-09-28 179 views
0

的範圍內,我有以下查詢:SQL新日表根據日期

[email protected] [hatsize]> SELECT COUNT(*) AS C,EventID,Start,End,sysname FROM complete_ev WHERE type = 's' AND EventID = 6881; 
+----+---------+---------------------+---------------------+---------+ 
| C | EventID | Start    | End     | sysname | 
+----+---------+---------------------+---------------------+---------+ 
| 26 | 6881 | 2013-09-09 12:00:00 | 2013-09-13 22:00:00 | sv-esx4 | 
+----+---------+---------------------+---------------------+---------+ 

我想創建一個新表的計數,事件ID和sysname類型,但我想日期爲每天這樣的東西像:

26 6881 2013-09-09 sv-esx4 
26 6881 2013-09-10 sv-esx4 
26 6881 2013-09-11 sv-esx4 
26 6881 2013-09-12 sv-esx4 
26 6881 2013-09-13 sv-esx4 

任何人都可以告訴我我怎麼能做到這一點?我嘗試了一些東西,但沒有提出正確的公式。 謝謝。

+0

我現在正在重新閱讀此內容,我認爲您的要求中有一項內容不明確。您是否在尋找每天EventID 6881的總計數,而不是每天6881次的計數?這會爲每一行產生相同的計數。這是你需要的嗎?這是與下面的答案不同的操作(雖然如果我正在閱讀此權利,以下答案將成爲解決方案的一部分)。 – MystikSpiral

+0

是的,道歉。我需要每天計算EventID 6881的總數。所以一個相同的行,每個EventID每天都沒有變化,我只想每天計數。 – salparadise

+0

我終於拼湊在一起的要求。您需要在單行上的開始日期和結束日期之間的無間隙日期列表。這部分將有助於指出。 – MystikSpiral

回答

1

您需要一個適用於您查找日期範圍的驅動程序表(您可以使用子查詢或CTE,但完整的表格是值得的)。創建日曆表將是在性能方面做到這一點的最佳方式。如果需要,您可以找到大量的固定SQL腳本集合來創建日曆表。此資源將始終派上用場,所以它非常值得所需的最小設置工作量。假設你有一個日曆表,然後你可以執行以下操作:

SELECT allEvents.totalCount AS C, 
    ev.EventID, 
    CAST(c.Date AS Date) AS date, 
    ev.sysname 
FROM complete_ev ev 
RIGHT JOIN calendar c ON c.Date BETWEEN ev.Start AND ev.End 
INNER JOIN (SELECT COUNT(EventID) AS totalCount, EventID FROM complete_ev GROUP BY EventID) AS allEvents ON ev.EventID = allEvents.eventID 
WHERE ev.type = 's' 
    AND ev.EventID = 6881; 

這實際上是票證。祝你好運。

+0

感謝您在最後需要GROUP BY日期。對於問題中缺乏細節的道歉。 – salparadise