I have a table called EventLog like this:
I would like to display the count of each event type for each deviceId like so:
Then, ultimately, show only devices where the type3 count and type4 counts differ:
I know I will need to use COUNT and GROUP BY and possibly a nested SELECT?
I've tried:
SELECT
deviceId,
MIN(eventType) AS [Type3],
MAX(eventType) AS [Type4]
FROM
EventLog
WHERE
eventType IN (3,4)
GROUP BY
deviceId;
But that just returns the minimum and maximum value for each deviceID instead of counting the occurrences of type 3 and type 4 eventTypes.
I'm having trouble figuring out how to split the eventType values into their own columns.
I've also tried:
SELECT deviceId, COUNT(eventType)
FROM eventLog
WHERE eventType = 3
GROUP BY deviceId;
But that (obviously) only returns the count per deviceId for eventType 3 - and I need a column for eventType 3 AND one for eventType4.
CodePudding user response:
You can sum the cases in your select and filter in the having where those sums don't match.
SELECT
deviceId,
SUM(CASE WHEN eventType = 3 THEN 1 ELSE 0 END) as type3Count,
SUM(CASE WHEN eventType = 4 THEN 1 ELSE 0 END) as type4Count
FROM
eventLog
WHERE
eventType IN(3,4)
GROUP BY
deviceId
HAVING
SUM(CASE WHEN eventType = 4 THEN 1 ELSE 0 END) <> SUM(CASE WHEN eventType = 3 THEN 1 ELSE 0 END)
