2014-07-23 13 views
2

的bug我現在有Bugs看起來像這樣:分組類型按日期和優先級

|ID  |Priority |Created |Updated |Status |Category 
    |X123 |Major  |01/01  |01/03  |Open  |A 
    |X145 |Normal |01/01  |01/02  |Closed |B 
    |X678 |Minor  |01/03  |01/03  |Open  |C 
    |X763 |Major  |01/02  |01/03  |Closed |C 

所有列都是VARCHAR(25),除了創建和更新,這是日期。

我需要創建格式如下一種觀點:

|Date  |Major |Normal |Minor  |Category 
    |01/01  |4  |3   |4   |A 
    |01/01  |3  |5   |2   |B 
    |01/01  |2  |4   |7   |C  
    |01/02  |7  |3   |4   |A 
    |01/02  |3  |9   |5   |B 
    |01/02  |1  |6   |3   |C 

凡重大,正常和未成年人的數字是在給定日期優先當前打開的bug的數量。通過當前打開,我的意思是:在間隔Created - GETDATE()上打開的錯誤處於活動狀態,在間隔Created - Updated上關閉的錯誤處於活動狀態。

我有我通過這個查詢需要的所有日期的列表:

WITH D AS 
    (
     SELECT Dates AS DateValue 
     FROM DatesTable 
     WHERE Dates >= '2012-03-23' 
     AND Dates <= GETDATE() 
    ), 

的我怎麼可能做到這一點任何想法?我已經玩過關於數據透視查詢和分組的想法,但我無法覆蓋我需要的一切。非常感謝您的幫助!


編輯:Bugs錶帶有示例數據

CREATE TABLE [dbo].[Bugs](
      [ID] [varchar](25) NOT NULL, 
      [Priority] [varchar](25) NOT NULL, 
      [Updated] [date] NOT NULL, 
      [Created] [date] NOT NULL, 
      [Status] [varchar](25) NOT NULL, 
      [Category] [varchar](25) NOT NULL, 
      ) ON [PRIMARY] 

    INSERT INTO Bugs VALUES (X123, Major, 01/01/12, 01/03/12, Open, A) 
    INSERT INTO Bugs VALUES (X145, Normal, 01/01/12, 01/02/12, Closed, B) 
    INSERT INTO Bugs VALUES (X678, Minor, 01/03/12, 01/03/12, Open, C) 
    INSERT INTO Bugs VALUES (X763, Major, 01/02/12, 01/03/12, Closed, C) 
+3

如何處理某些ddl和樣本數據?你可以在這裏發佈或使用sqlfiddle.com。如果你能解釋你想要的,也會有所幫助。我不認爲需要一個支點。這看起來像我的基本聚合,但很難說沒有更多的細節。 –

+0

@SeanLange我添加了一個例子。我無法發佈實際數據,但我希望這有助於 – Rose

+0

不要求提供真實數據。但是一些表格,所以我不必構建它們將會使這個過程變得更加簡單。我會一起扔東西,但它可能會或可能不會工作,因爲我沒有辦法測試它。 –

回答

1

這是我在上次測試:

SELECT d.Dates as Date, 
    SUM(CASE Priority WHEN 'Major' THEN 1 ELSE 0 END) as Major, 
    SUM(CASE Priority WHEN 'Normal' THEN 1 ELSE 0 END) as Normal, 
    SUM(CASE Priority WHEN 'Minor' THEN 1 ELSE 0 END) as Minor, 
    b.Category 
    FROM Bugs b 
INNER JOIN DatesTable d ON d.Dates >= b.Created 
WHERE (Status = 'Closed' AND d.Dates <= Updated OR Status = 'Open') 
    AND d.Dates <= GETDATE() AND d.Dates >= '2012-01-01' 
GROUP BY d.Dates, b.Category 
ORDER BY d.Dates 
+0

清晰簡潔。優秀 – Rose

+0

優秀的問題值得回答:) – Alireza

1

像這樣的東西可能是你所期待的。

select b.Date 
    , SUM(case when b.Priority = 'Major' then 1 end) as Major 
    , SUM(case when b.Priority = 'Normal' then 1 end) as Normal 
    , SUM(case when b.Priority = 'Minor' then 1 end) as Minor 
    , b.Category 
from Bugs b 
group by b.Date, b.Category 
order by b.Date 
+0

說實話,我不認爲OP已經提供了日期列表CTE。對我來說,這顯然意味着他們需要在這段時間內的所有日期。 –

+0

我比你更喜歡你的答案! – Alireza

+0

另外,'Bugs'中沒有'Date'列。 –

0

您可以使用下面的查詢

SELECT DatesTable.Dates 
    , SUM(CASE WHEN bugs.Priority = 'Major' THEN 1 ELSE 0 END) AS Major 
    , SUM(CASE WHEN bugs.Priority = 'Normal' THEN 1 ELSE 0 END) AS Normal 
    , SUM(CASE WHEN bugs.Priority = 'Minor' THEN 1 ELSE 0 END) AS Minor 
    , bugs.Category 
FROM DatesTable 
LEFT JOIN Bugs ON DatesTable.Dates = Bugs.Date 
    -- You may need to cast this, if the data type do not match 
    AND Bugs.Status='Open' 

WHERE Dates >= '2012-03-23' 
     AND Dates <= GETDATE() 
GROUP BY DatesTable.Dates, bugs.Category 
ORDER BY DatesTable.Dates 
1

不是使用CTE,我已經使用的查詢爲您所需要的基地。通過將datestable與bug表連接起來,我們可以比較bug表中的日期以查看bug是否在給定日期打開。我們知道d.dates必須大於錯誤的創建日期。我們還需要檢查錯誤狀態。如果該錯誤是開放的,那麼我們只希望在更新日期之前包含錯誤。否則,該錯誤需要包含至今,因爲它仍然是開放的。其餘的基本上是手動的旋轉數據來獲得你需要的值。

SELECT d.Dates, sum(case when b.priority = major then 1 else 0 end) as major, 
     sum(case when b.priority = normal then 1 else 0 end) as normal, 
     sum(case when b.priority = minor then 1 else 0 end) as minor, 
     b.category 
FROM DatesTable d 
    join bugs b 
    on d.dates >= b.Created 
    and case when b.status = 'closed' then b.updated else '12-31-9999' end <= d.dates 
WHERE d.Dates >= '2012-03-23' 
AND d.Dates <= GETDATE() 
Group by d.dates,b.category 
0

我們可以使用嵌套查詢來得到我們想要的工作數據,和家長查詢,顯示最終結果:

SELECT CreatedDate AS [Date], 
     SUM(Major) AS Major, 
     SUM(Normal) AS Normal, 
     SUM(Minor) AS Minor, 
     Category 
    FROM (
     SELECT DATEADD(dd, DATEDIFF(dd, 0, Created), 0) AS CreatedDate, 
       CASE WHEN Priority = 'Major' THEN 1 ELSE 0 END AS Major, 
       CASE WHEN Priority = 'Normal' THEN 1 ELSE 0 END AS Normal, 
       CASE WHEN Priority = 'Minor' THEN 1 ELSE 0 END AS Minor, 
       Category 
      FROM Bugs 
      WHERE Status = 'Open' 
     ) AS t 
    GROUP BY CreatedDate, Category 
    ORDER BY CreatedDate, Category 

信貸從一個DATETIME去除的時間去this SO question

嵌套查詢可以更輕鬆地查看正在對哪些數據進行操作,並根據需要過濾所述數據。

我假設Date是DATETIME,所以我刪除了分組的時間部分。

查看SQL Fiddle中的示例(我只爲前兩項添加足夠的數據以匹配預期結果)。