2016-04-25 6 views
0

私はこの情報を持つテーブルの活動を持っているように異なる数を選択します。私は月 、それらを好きで出力することによって、動物によってタスクをカウントする1つの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  | 
|    |   |   |   |   |   | 
+--------------+---------+---------+---------+---------+---------+ 

私は多くの選択肢を結合することによってカウントを得ることができますが、それはほとんど効率的ではなく、上記のような使用可能なテーブルのような表示を作成しません。

私はそれが自動的に最後の5ヶ月間を狙い撃ちしたいと思いますので、

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

さらにそれはSSRSのためである、しかし私は、select文は私のより良いを取得している前に、この点で類似した何かを行っています。

ご協力いただきありがとうございます。

+0

これがSSRSレポートの場合は、SSRSで 'Matrix'を使用してください。これは、私のグループのエイリアシングのオプションがないために面倒です。 SQLでその集計を実行するよりもずっと簡単になり(さらに多くのdyniamc)なります。 –

+0

タスクテキストを解析する以外の方法で動物が何であるか他の兆候はありますか? "Donkey kicked Cat"の仕事は何ですか? –

+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なしでこれを行うことができます。

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

ありがとうDave、それは本当に便利です – beehive

関連する問題