Reputation: 519
Data:
name | car color
-----+---------
mike | green
mike | blue
mike | red
bob | green
bob | red
tom | blue
Desired result:
name | green count | blue count | red count
-----+-------------+------------+---------
mike | 1 | 1 | 1
bob | 1 | 0 | 1
tom | 0 | 1 | 0
I was thinking about running several subqueries and left joining such as:
select name, count(*) as count blue
from table
where car color = 'blue'
etc
Thank you
Upvotes: 0
Views: 88
Reputation: 682
If you know the colors at design time, you can use a pivot.
DECLARE @t TABLE
(
personName NVARCHAR(16) NOT NULL,
carColor NVARCHAR(16) NOT NULL
);
INSERT INTO @t
(
personName,
carColor
)
VALUES
('mike', 'green'),
('mike', 'blue'),
('mike', 'red'),
('bob', 'green'),
('bob', 'red'),
('tom', 'blue');
SELECT t.personName,
t.red,
t.blue,
t.green
FROM
(
SELECT pvt.*
FROM @t t
PIVOT
(
COUNT(carColor)
FOR carColor IN ([green], [blue], [red])
) pvt
) AS t;
Output:
bob 1 0 1
mike 1 1 1
tom 0 1 0
Upvotes: 2
Reputation: 222722
You can use conditional aggregation:
SELECT
name,
SUM(CASE WHEN car_color = 'green' THEN 1 ELSE 0 END) green_count,
SUM(CASE WHEN car_color = 'blue' THEN 1 ELSE 0 END) blue_count,
SUM(CASE WHEN car_color = 'red' THEN 1 ELSE 0 END) red_count
FROM mytable
GROUP BY name
Upvotes: 4