Reputation: 1553
I have sql ;
select
Program,
CASE WHEN ClassMissed = 0 THEN COUNT(ClassMissed) ELSE 0 END as Completed,
CASE WHEN ClassMissed = 1 THEN COUNT(ClassMissed) ELSE 0 END as One_Days_Missed,
CASE WHEN ClassMissed = 2 THEN COUNT(ClassMissed) ELSE 0 END as Two_Days_Missed,
CASE WHEN ClassMissed = 3 THEN COUNT(ClassMissed) ELSE 0 ENd as Three_Days_Missed
from
#temp
group by Program,ClassMissed
Which gives me below out put:
Program | Completed | One_Days_Missed | Two_Days_Missed |Three_Days_Missed
________________________________________________________________________________
Prog1 | 0 | 19 | 0 | 0
Prog1 | 0 | 0 | 0 | 2
But I'm expecting below table
Program | Completed | One_Days_Missed | Two_Days_Missed |Three_Days_Missed
________________________________________________________________________________
Prog1 | 0 | 19 | 0 | 2
I have to do the group by Classmissed in order to run the query.
Please give me better solution for this ?
Thank you
Upvotes: 0
Views: 48
Reputation: 31879
You should use SUM(CASE WHEN..END)
.
CREATE TABLE #Temp(
Program VARCHAR(20),
ClassMissed INT
)
INSERT INTO #Temp VALUES
('Prog1', 1), ('Prog1', 1), ('Prog1', 1),
('Prog1', 1), ('Prog1', 1), ('Prog1', 1),
('Prog1', 1), ('Prog1', 1), ('Prog1', 1),
('Prog1', 1), ('Prog1', 1), ('Prog1', 1),
('Prog1', 1), ('Prog1', 1), ('Prog1', 1),
('Prog1', 1), ('Prog1', 1), ('Prog1', 3),
('Prog1', 1), ('Prog1', 1), ('Prog1', 3);
SELECT
Program,
SUM(CASE WHEN ClassMissed = 0 THEN 1 ELSE 0 END) AS Completed,
SUM(CASE WHEN ClassMissed = 1 THEN 1 ELSE 0 END) AS One_Days_Missed,
SUM(CASE WHEN ClassMissed = 2 THEN 1 ELSE 0 END) AS Two_Days_Missed,
SUM(CASE WHEN ClassMissed = 3 THEN 1 ELSE 0 END) AS Three_Days_Missed
FROM #Temp
GROUP BY Program
DROP TABLE #Temp
RESULT
Program Completed One_Days_Missed Two_Days_Missed Three_Days_Missed
-------------------- ----------- --------------- --------------- -----------------
Prog1 0 19 0 2
Upvotes: 1