选择不同的计数作为一个选择语句

时间:2016-04-25 17:50:15

标签: sql tsql reporting-services

我有一个包含此信息的表活动:

+----------------------+---------------------+
| 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       |
|              |         |         |         |         |         |
+--------------+---------+---------+---------+---------+---------+

我可以通过合并大量的选择来获得计数,但它几乎没有效率,并且它不会像上面那样创建一个可用的类似于表格的显示。

e.g。

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

此外,对于SSRS而言,我希望它能够自动选择最近5个月,我在这方面做了类似的事情,然而选择陈述对我来说变得越来越好。

提前致谢,欢迎所有建议。

1 个答案:

答案 0 :(得分: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)