【发布时间】:2019-11-24 00:17:31
【问题描述】:
我正在尝试查询一个表以返回本年度每个月的项目中不同用户的总数。我的查询有效,除了它返回 2 行,其中每个月有每个项目的用户总数(其中计算了重复的用户,我不想要)。第二行正是我想要的。
如何修复我的查询以仅返回第二行数据?
下面我有一个示例表和我想出的查询:
CREATE TABLE [table_emp]
([Username] varchar(8), [Project] varchar(8), [Hours] int, [DateInfo] date);
INSERT INTO [table_emp]
([Username], [Project], [DateInfo])
VALUES
('userA', 'ProjectA', 5, '2019-03-19 00:00:00'),
('userA', 'ProjectA', 5, '2019-03-07 00:00:00'),
('userB', 'ProjectA', 5, '2019-03-07 00:00:00'),
('userB', 'ProjectB', 2, '2019-11-12 00:00:00'),
('userB', 'ProjectC', 1, '2019-11-12 00:00:00');
SELECT
SUM(CASE datepart(month,DateInfo) WHEN 1 THEN 1 ELSE 0 END) AS 'January',
SUM(CASE datepart(month,DateInfo) WHEN 2 THEN 1 ELSE 0 END) AS
'February',
SUM(CASE datepart(month,DateInfo) WHEN 3 THEN 1 ELSE 0 END) AS 'March',
SUM(CASE datepart(month,DateInfo) WHEN 4 THEN 1 ELSE 0 END) AS 'April',
SUM(CASE datepart(month,DateInfo) WHEN 5 THEN 1 ELSE 0 END) AS 'May',
SUM(CASE datepart(month,DateInfo) WHEN 6 THEN 1 ELSE 0 END) AS 'June',
SUM(CASE datepart(month,DateInfo) WHEN 7 THEN 1 ELSE 0 END) AS 'July',
SUM(CASE datepart(month,DateInfo) WHEN 8 THEN 1 ELSE 0 END) AS 'August',
SUM(CASE datepart(month,DateInfo) WHEN 9 THEN 1 ELSE 0 END) AS
'September',
SUM(CASE datepart(month,DateInfo) WHEN 10 THEN 1 ELSE 0 END) AS
'October',
SUM(CASE datepart(month,DateInfo) WHEN 11 THEN 1 ELSE 0 END) AS
'November',
SUM(CASE datepart(month,DateInfo) WHEN 12 THEN 1 ELSE 0 END) AS
'December',
SUM(CASE datepart(year,DateInfo) WHEN YEAR(GETDATE()) THEN 1 ELSE 0 END)
AS 'TOTAL'
FROM
table_emp
WHERE
YEAR(DateInfo) = YEAR(GETDATE())
GROUP BY Username;
+---------+----------+-------+-------+-----+------+------+--------+-----------+---------+----------+----------+-------+
| January | February | March | April | May | June | July | August | September | October | November | December | Total |
+---------+----------+-------+-------+-----+------+------+--------+-----------+---------+----------+----------+-------+
| 0 | 0 | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 |
| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 3 |
+---------+----------+-------+-------+-----+------+------+--------+-----------+---------+----------+----------+-------+
我期待下面的回报:
+---------+----------+-------+-------+-----+------+------+--------+-----------+---------+----------+----------+-------+
| January | February | March | April | May | June | July | August | September | October | November | December | Total |
+---------+----------+-------+-------+-----+------+------+--------+-----------+---------+----------+----------+-------+
| 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 2 | 0 | 3 |
+---------+----------+-------+-------+-----+------+------+--------+-----------+---------+----------+----------+-------+
【问题讨论】:
-
考虑使用 PIVOT 而不是所有这些 CASE 语句。一开始可能会更困难,但会产生更简洁的代码。签出this。
标签: sql sql-server tsql group-by pivot