Reputation: 73
I need to get items received within different specified time periods within a day. An output like this;
Do anyone have idea how i can implement a sql query to return result table like this, Thanks in advance.
Upvotes: 0
Views: 1554
Reputation:
You can do this:
SELECT Item,
SUM(CASE WHEN CAST(DateTimeCol AS Time) >= '08:00:00' AND CAST(DateTimeCol AS Time) < '10:00:00' THEN 1 ELSE 0 END) AS [8AM-10AM],
SUM(CASE WHEN CAST(DateTimeCol AS Time) >= '10:00:00' AND CAST(DateTimeCol AS Time) < '12:00:00' THEN 1 ELSE 0 END) AS [8AM-10AM],
SUM(CASE WHEN CAST(DateTimeCol AS Time) >= '12:00:00' AND CAST(DateTimeCol AS Time) < '14:00:00' THEN 1 ELSE 0 END) AS [10AM-12AM],
SUM(CASE WHEN CAST(DateTimeCol AS Time) >= '14:00:00' AND CAST(DateTimeCol AS Time) < '16:00:00' THEN 1 ELSE 0 END) AS [12PM-2PM],
SUM(CASE WHEN CAST(DateTimeCol AS Time) >= '16:00:00' THEN 1 ELSE 0 END) AS [>4PM]
FROM table1
GROUP BY Item;
Sample Results:
| Item | 8AM-10AM | 10AM-12AM | 12PM-2PM | 2AM-4PM | >4PM |
|--------|----------|-----------|----------|---------|------|
| Item 1 | 2 | 4 | 1 | 0 | 0 |
| Item 2 | 0 | 0 | 1 | 2 | 2 |
Update:
You can use the PIVOT
table operator with temporary table with all the time ranges as following:
SELECT *
FROM
(
SELECT
Item,
Alias
FROM Table1
INNER JOIN Ranges ON CAST(DateTimeCol AS TIME) >= [Start]
AND CAST(DateTimeCol AS TIME) < [End]
) AS t
PIVOT
(
COUNT(Alias)
FOR Alias IN([8AM-10AM], [10AM-12AM], [12PM-2PM],[2PM-4PM], [>4PM])
) AS p;
Upvotes: 3