I have a table like this
Date | Name | StateData | ------+-------+-----------+ xxxxx | Tom | OPENED | xxxxx | David | NULL | xxxxx | Tom | NULL | xxxxx | Brand | CLOSED | xxxxx | Brand | NULL | xxxxx | Brand | OPENED |
What result I want to achieve is something like this
Date | Name | OPENED | CLOSED | UNUSED | -----+------+--------+--------+--------+ xxxxx| Tom | 1 | 0 | 1 | xxxxx| David| 0 | 0 | 1 | xxxxx| Brand| 1 | 1 | 1 |
I’ve tried something like this
SELECT
Name,
[OPENED] = COUNT(CASE WHEN StateData ='OPENED' THEN StateData END),
[CLOSED] = COUNT(CASE WHEN StateData ='CLOSED' THEN StateData END),
[UNUSED] = COUNT(CASE WHEN StateData IS NULL THEN StateData END)
FROM
[dbo].[StateData]
GROUP BY
Name
the result is that I don’t have at least duplicate records in Name column, but I can clearly see with simple select count(*) that the counts in the columns are not right.
First of all I did google some samples, and made the SELECT above.
Advertisement
Answer
I would use SUM() instead. You have a problem with NULL:
SELECT Name,
SUM(CASE WHEN StateData = 'OPENED' THEN 1 ELSE 0 END) as opened
SUM(CASE WHEN StateData = 'CLOSED' THEN 1 ELSE 0 END) as closed
SUM(CASE WHEN StateData IS NULL THEN 1 ELSE 0 END) as unused
FROM [dbo].[StateData]
GROUP BY Name;
Your unused will always be zero because COUNT(NULL) is always zero.