我有一个包含此信息的表活动:
+----------------------+---------------------+
| 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个月,我在这方面做了类似的事情,然而选择陈述对我来说变得越来越好。
提前致谢,欢迎所有建议。
答案 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)