您可以使用此查询:
SELECT
regdate,
SEC_TO_TIME(TRUNCATE(TIME_TO_SEC(regtime)/(60*30),0)*(60*30)) reginterval,
COUNT(CASE WHEN items='item1' THEN 1 END) item1,
COUNT(CASE WHEN items='item2' THEN 1 END) item2,
COUNT(CASE WHEN items='item3' THEN 1 END) item3,
COUNT(CASE WHEN items='item4' THEN 1 END) item4
FROM Data
GROUP BY
regdate,
reginterval
如果需要将结果行插入到新表中,只需在开头添加以下行:
INSERT INTO ItemsPerInterval (regdate, reginterval, item1, item2, item3, item4)
SELECT ...
编辑
如果您还想显示所有间隔,即使它们没有值,我认为您可以做的最好的事情是有一个表间隔,其中包含您需要的所有间隔:
CREATE TABLE Intervals (
reginterval time
);
INSERT INTO Intervals VALUES
('09:00:00'),
('09:30:00'),
('10:00:00'),
...
此查询返回所有间隔,并结合表中的所有日期:
SELECT Dates.regdate, Intervals.reginterval
FROM
(SELECT DISTINCT regdate FROM Data) Dates,
Intervals
此查询返回您需要的行:
SELECT
di.regdate,
di.reginterval,
COUNT(CASE WHEN Data.items='item1' THEN 1 END) item1,
COUNT(CASE WHEN Data.items='item2' THEN 1 END) item2,
COUNT(CASE WHEN Data.items='item3' THEN 1 END) item3,
COUNT(CASE WHEN Data.items='item4' THEN 1 END) item4
FROM (
SELECT Dates.regdate, Intervals.reginterval
FROM (SELECT DISTINCT regdate FROM Data) Dates,
Intervals
) di
LEFT JOIN Data
ON di.regdate=Data.regdate
AND di.reginterval=SEC_TO_TIME(TRUNCATE(TIME_TO_SEC(Data.regtime)/(60*30),0)*(60*30))
GROUP BY
regdate,
reginterval;
请参阅小提琴here.
这是如何运作的
这里的想法是使用TIME_TO_SEC函数将regtime(包含时间的字段)转换为自当天开始以来的秒数.
TIME_TO_SEC(regtime)
然后我们将这个数字除以60 * 30,这是30分钟内的秒数,只保留整数部分:
TRUNCATE(number_of_seconds/(60*30), 0)
然后我们将整数部分乘以60 * 30以获得秒数,舍入60 * 30秒(30分钟).
使用SEC_TO_TIME,我们将秒数转换回时间字段.