在SQL Server 2008中。
我的组件有两种状态之一,表格如下:
create table Things (
ThingName varchar(10),
ItemNumber INT,
ItemStatus varchar(10));
INSERT INTO Things (
ThingName,
ItemNumber,
ItemStatus)
VALUES
('a', 1, 'red'),
('a', 2, 'red'),
('a', 3, 'blue'),
('b', 1, 'red'),
('b', 2, 'red'),
('b', 3, 'red'),
('b', 4, 'red'),
('c', 1, 'blue'),
('c', 2, 'blue'),
('c', 3, 'red');
每件事我需要的结果是 1)项目总数 2)总红色项目 3)总蓝色项目
结果如下:
ThingName TotalItems RedItems BlueItems
a 3 2 1
b 4 4 0
c 3 1 2
我用来执行此操作的“明显”查询:
SELECT
ThingName,
sum(Red + Blue) as TotalItems,
sum(Red) as RedItems,
sum(Blue) as BlueItems
FROM (
SELECT
ThingName,
case
when ItemStatus = 'red' then count(*)
else 0
end as Red,
case
when ItemStatus = 'blue' then count(*)
else 0
end as Blue
FROM Things
GROUP BY
ThingName,
ItemStatus) a GROUP BY ThingName;
这有效,但似乎很原始,不满意。实际上,似乎我没有看到如何在不采用两步法的情况下按需聚合。建议?
答案 0 :(得分:3)
您可以使用条件聚合简化事情:
SELECT
ThingName,
count(ItemNumber) as TotalItems,
count(case when ItemStatus='Red' then ItemNumber end) as RedItems,
count(case when ItemStatus='Blue' then ItemNumber end) as BlueItems
FROM Things
GROUP BY ThingName;
因此,不是使用使用CASE
表达式来获取Total,Red,Blue项的子查询,而是在聚合函数内直接使用CASE
表达式 ,在这种情况下COUNT
。
答案 1 :(得分:1)
也可以使用sum
:
SELECT
ThingName,
COUNT(*) as TotalItems,
SUM(CASE ItemStatus WHEN 'Red' THEN 1 ELSE 0 END) AS RedItems,
SUM(CASE ItemStatus WHEN 'Blue' THEN 1 ELSE 0 END) AS BlueItems
FROM Things
GROUP BY ThingName;