Reputation: 209
I have a query that gets a count of all the tickets assigned to a team:
SELECT 'Application Developers' AS team, COUNT(Assignee) AS tickets
from mytable WHERE status = 'Open' AND Assignee like '%Application__bDevelopers%'
UNION ALL
SELECT 'Desktop Support' AS team, COUNT(Assignee) AS tickets
from mytable WHERE status = 'Open' AND Assignee like '%Desktop__bSupport%'
UNION ALL
SELECT 'Network Management' AS team, COUNT(Assignee) AS tickets
FROM mytable WHERE status = 'Open' AND Assignee LIKE '%Network__bManagement%'
UNION ALL
SELECT 'Security' AS team, COUNT(Assignee) AS tickets
from mytable WHERE status = 'Open' AND Assignee = '%Security%'
UNION ALL
SELECT 'Telecom' AS team, COUNT(Assignee) AS tickets
from mytable WHERE status = 'Open' AND Assignee = '%Telecom%'
The result is:
team tickets
Application Developers 6
Desktop Support 374
Network Management 0
Security 7
Telecom 0
How can I exclude the results that come back with "0" tickets?
Upvotes: 1
Views: 3701
Reputation: 444
You can use Common table expressions instead of using Having
;WITH CTE AS
(
SELECT 'Application Developers' AS team, COUNT(Assignee) AS tickets
from mytable WHERE status = 'Open' AND Assignee like '%Application__bDevelopers%'
UNION ALL
SELECT 'Desktop Support' AS team, COUNT(Assignee) AS tickets
from mytable WHERE status = 'Open' AND Assignee like '%Desktop__bSupport%'
UNION ALL
SELECT 'Network Management' AS team, COUNT(Assignee) AS tickets
FROM mytable WHERE status = 'Open' AND Assignee LIKE '%Network__bManagement%'
UNION ALL
SELECT 'Security' AS team, COUNT(Assignee) AS tickets
from mytable WHERE status = 'Open' AND Assignee = '%Security%'
UNION ALL
SELECT 'Telecom' AS team, COUNT(Assignee) AS tickets
from mytable WHERE status = 'Open' AND Assignee = '%Telecom%'
)
SELECT
*
FROM CTE
WHERE tickets>0
Upvotes: 1
Reputation: 93754
Instead of using Union all between bunch of queries Change your query like this.
Use Having clause
to filter the group's where count <> 0
SELECT CASE
WHEN Assignee LIKE '%Application__bDevelopers%' THEN 'Application Developers'
WHEN Assignee LIKE '%Desktop__bSupport%' THEN 'Desktop Support'
WHEN Assignee LIKE '%Network__bManagement%' THEN 'Network Management'
WHEN Assignee LIKE '%Security%' THEN 'Security'
WHEN Assignee LIKE '%Telecom%' THEN 'Telecom'
END AS team,
Count(Assignee) AS tickets
FROM mytable
WHERE status = 'Open'
AND ( Assignee LIKE '%Application__bDevelopers%'
OR Assignee LIKE '%Desktop__bSupport%'
OR Assignee LIKE '%Network__bManagement%'
OR Assignee = '%Security%'
OR Assignee = '%Telecom%' )
GROUP BY CASE
WHEN Assignee LIKE '%Application__bDevelopers%' THEN 'Application Developers'
WHEN Assignee LIKE '%Desktop__bSupport%' THEN 'Desktop Support'
WHEN Assignee LIKE '%Network__bManagement%' THEN 'Network Management'
WHEN Assignee LIKE '%Security%' THEN 'Security'
WHEN Assignee LIKE '%Telecom%' THEN 'Telecom'
END
HAVING Count(Assignee) <> 0
Upvotes: 1
Reputation: 16512
You can use HAVING
for each query:
SELECT 'Application Developers' AS team, COUNT(Assignee) AS tickets
from mytable WHERE
status = 'Open'
AND Assignee like '%Application__bDevelopers%'
HAVING COUNT(Assignee) <> 0
I'd suggest @NoDisplayName's answer because your query as it stands is quite inefficient.
Upvotes: 4
Reputation: 69594
Another way of writing this query would be to avoid all of these UNION ALL queries and do something like
SELECT Teams
,Tickets
FROM
(
SELECT NULLIF(COUNT(CASE WHEN Assignee LIKE '%Application__bDevelopers%'
THEN 1 ELSE NULL END),0) AS [Application__bDevelopers]
,NULLIF(COUNT(CASE WHEN Assignee LIKE '%Desktop__bSupport%'
THEN 1 ELSE NULL END),0) AS [Desktop__bSupport]
,NULLIF(COUNT(CASE WHEN Assignee LIKE '%Network__bManagement%'
THEN 1 ELSE NULL END),0) AS [Network__bManagement]
,NULLIF(COUNT(CASE WHEN Assignee LIKE '%Security%'
THEN 1 ELSE NULL END),0) AS [Security]
,NULLIF(COUNT(CASE WHEN Assignee LIKE '%Telecom%'
THEN 1 ELSE NULL END),0) AS [Telecom]
FROM mytable
WHERE [status] = 'Open' ) Q
UNPIVOT (Tickets FOR Teams IN ([Application__bDevelopers], [Desktop__bSupport]
,[Network__bManagement],[Security],[Telecom]))up
Upvotes: 1