2016-04-25 48 views
0

我有這個信息的表活動:選擇不同的數作爲一個select語句

+----------------------+---------------------+ 
| Task varchar(20)  | AddedDate datetime | 
+----------------------+---------------------+ 
| Bought Donkey  | 2016-04-25 18:16:44 | 
| Fed Donkey   | 2016-04-18 18:16:44 | 
| Gave Donkey water | 2016-04-03 18:16:44 | 
| Donkey race   | 2016-03-30 18:16:44 | 
| Donkey sleep   | 2016-03-12 18:16:44 | 
| Donkey did exercises | 2016-02-45 18:16:44 | 
| Took Donkey to shop | 2016-01-05 18:16:44 | 
| Bought Cat   | 2015-12-19 18:16:44 | 
| Fed Cat    | 2015-12-14 18:16:44 | 
| Fed Donkey   | 2015-12-06 18:16:44 | 
|      |      | 
+----------------------+---------------------+ 

我想一個月 和輸出他們喜歡數由動物的任務如下:

+--------------+---------+---------+---------+---------+---------+ 
| Animal  | 2016-04 | 2016-03 | 2016-02 | 2016-01 | 2015-12 | 
+--------------+---------+---------+---------+---------+---------+ 
| Donkey  | 3  | 2  | 1  | 1  | 1  |  
| Cat   | 0  | 0  | 0  | 0  | 2  | 
|    |   |   |   |   |   | 
+--------------+---------+---------+---------+---------+---------+ 

我可以通過合併大量選擇來獲得計數,但效率並不高,並且不會創建如上所述的可用表格式顯示。

例如

select count(*) 
from Activity 
where month(AddedDate) = month(getdate()) - 1 
and year(AddedDate) = 2016 
and Task like '%Donkey%' 

而且它是一個SSRS,所以我想它會自動摘下去年5月份,我已經在這方面做類似的事情,不過select語句,讓我的好轉。

在此先感謝,歡迎您提出所有建議。

+0

如果這是用於SSRS報告,那麼在SSRS中使用一個Matrix;它會比在SQL中進行聚合更容易(和更多dyniamc)。 –

+0

除了解析任務文本之外,您還有其他什麼動物指示嗎? 「驢踢貓」的任務是什麼? –

+0

哈哈!!我創建了Donkey和Cat來解釋我需要做什麼,但是很遺憾,我不得不從用戶輸入的文本中提取關鍵字。感謝您的建議,我會查找矩陣 – beehive

回答

0
DECLARE @Activity TABLE (Task VARCHAR(20), AddedDate DATETIME) 

INSERT INTO @Activity VALUES 
    ('Bought Donkey','2016-04-25 18:16:44'), 
    ('Fed Donkey','2016-04-18 18:16:44'), 
    ('Gave Donkey water','2016-04-03 18:16:44'), 
    ('Donkey race','2016-03-30 18:16:44'), 
    ('Donkey sleep','2016-03-12 18:16:44'), 
    ('Donkey did exercises','2016-02-25 18:16:44'), 
    ('Took Donkey to shop','2016-01-05 18:16:44'), 
    ('Bought Cat','2015-12-19 18:16:44'), 
    ('Fed Cat','2015-12-14 18:16:44'), 
    ('Fed Donkey','2015-12-06 18:16:44') 

;WITH Animal 
    AS (
     SELECT 
      CASE 
       WHEN Task LIKE '%Donkey%' THEN 'Donkey' 
       WHEN Task LIKE '%Cat%' THEN 'Cat' 
       ELSE '' 
       END AS Animal 
       ,Task,AddedDate 
     FROM @Activity 
    ) 

SELECT Animal, LEFT(CONVERT(NVARCHAR,AddedDate,20),7) AS Date, COUNT(*) AS TaskCount 
    FROM Animal 
    GROUP BY Animal, LEFT(CONVERT(NVARCHAR,AddedDate,20),7) 

從這裏,如果你想以這種方式顯示,你將不得不使用數據透視表。不過,我不確定你是否可以做到這一點。或者,您可以透視自己的數據。順便說一句,你可以在沒有CTE的情況下做到這一點;它只是看起來很麻煩,因爲我沒有別名選擇我的GROUP BY:

SELECT 
    CASE WHEN Task LIKE '%Donkey%' THEN 'Donkey' 
     WHEN Task LIKE '%Cat%' THEN 'Cat' 
     ELSE '' END AS Animal, 
    LEFT(CONVERT(NVARCHAR,AddedDate,20),7) AS Date, 
    COUNT(*) AS TaskCount 
FROM @Activity 
GROUP BY CASE WHEN Task LIKE '%Donkey%' THEN 'Donkey' 
     WHEN Task LIKE '%Cat%' THEN 'Cat' 
     ELSE '' END, LEFT(CONVERT(NVARCHAR,AddedDate,20),7) 
+0

謝謝戴夫,這真的很有用 – beehive

相關問題