我有一张下面结构的表格:
id INT, order_id INT, datex DATE, timex TIME
例如,我想在特定时间段内从2017-10-24
到2017-10-26
选择订单ID的计数。与2:0:0 - 4:0:0
,4:0:0 - 6:0:0
等类似,并制作如下结果:
period | ordersID's
2:0:0 - 4:0:0 | 5
4:0:0 - 6:0:0 | 8
我可以通过查询来执行此操作,还是应该使用其他方法?
答案 0 :(得分:0)
首先,你的时间段是重叠的。目前尚不清楚订单是否发生在他们应属于的4个时期。对于我下面的例子,我假设在期末的时间发生的订单属于下一个时期。
使用查询解决此问题的一种方法是在SELECT和GROUP BY子句中使用case语句。
CREATE TABLE #test
(
id int identity(1,1),
order_id int,
datex date,
timex time
)
INSERT INTO #test VALUES
(5, '10/24/2017', '02:01'),
(5, '10/24/2017', '04:01'),
(6, '10/25/2017', '03:01'),
(7, '10/26/2017', '05:01'),
(8, '10/27/2017', '02:01')
SELECT
CASE
WHEN timex >= '02:00' AND timex < '04:00' THEN '2:0:0 - 4:0:0'
WHEN timex >= '04:00' AND timex < '06:00' THEN '4:0:0 - 6:0:0'
END AS 'periodLabel',
COUNT(order_id) AS 'OrderCount'
FROM
#test
WHERE
datex >= '10/24/2017'
AND datex <= '10/26/2017'
GROUP BY
CASE
WHEN timex >= '02:00' AND timex < '04:00' THEN '2:0:0 - 4:0:0'
WHEN timex >= '04:00' AND timex < '06:00' THEN '4:0:0 - 6:0:0'
END
解决此问题的另一种方法是创建一个包含您的时间段的表并加入它。我更喜欢这种解决方案,因为它更容易维护。
CREATE TABLE #timePeriod
(
periodLabel varchar(50),
periodBegin time,
periodEnd time
)
INSERT INTO #timePeriod VALUES
('02:00 - 04:00', '02:00', '04:00'),
('04:00 - 06:00', '04:00', '06:00')
SELECT
B.periodLabel,
COUNT(order_id) AS 'OrderCount'
FROM
#test AS A
JOIN #timePeriod AS B
ON A.timex >= B.periodBegin
AND A.timex < B.periodEnd
WHERE
A.datex >= '10/24/2017'
AND A.datex <= '10/26/2017'
GROUP BY
B.periodLabel