我有一个需要执行运行总和的查询 在日期/时间和班次。
班次是上午6:00到下午4:30 和下午6:00到4:30。
我正在使用的查询引擎是SQLite。
我遇到以下SQL查询的问题。您将在下面看到该查询 和当前的结果,然后是期望的结果。 按日期/时间/班次顺序排列当前结果 导致总QTY列也显示不正确的数据。
是否有人在此之前遇到过这个问题,并且可能 把我推向正确的方向。我愿意接受建议 即使我必须在没有查询的情况下对数据进行排序,最好使用 的java。
SELECT tdate, qty, shift,
(
SELECT sum( b.qty )
FROM table1 AS b
WHERE (
(
( b.id <= a.id AND b.shift = a.shift)
)
)
GROUP BY date(b.tdate)
)
AS bo_total
FROM table1 AS a
ORDER BY date( a.tdate ) ASC, a.shift ASC
当前结果
DATE/TIME QTY SHIFT TOTAL QTY
2014-04-21 07:19:00 60 first 60
2014-04-21 08:45:00 60 first 120
2014-04-21 09:52:00 60 first 180
2014-04-21 13:26:00 60 first 240
2014-04-21 18:51:00 60 second 60
2014-04-21 20:56:00 60 second 120
2014-04-22 06:52:00 60 first 60
2014-04-22 11:56:00 60 first 120
2014-04-22 19:12:00 60 second 60
2014-04-22 20:30:00 60 second 120
2014-04-22 00:50:00 60 second 120
2014-04-23 06:23:00 60 first 60
2014-04-23 09:19:00 60 first 120
2014-04-23 22:11:00 60 second 60
2014-04-23 19:39:00 60 second 120
2014-04-23 00:55:00 60 second 120
2014-04-24 06:59:00 60 first 60
2014-04-24 07:40:00 60 first 120
2014-04-24 16:03:00 60 first 240
2014-04-24 00:42:00 60 second 60
2014-04-24 20:25:00 60 second 120
2014-04-24 00:39:00 60 second 60
2014-04-24 02:32:00 60 second 60
期望的结果
DATE/TIME QTY SHIFT TOTAL QTY
2014-04-21 07:19:00 60 first 60
2014-04-21 08:45:00 60 first 120
2014-04-21 09:52:00 60 first 180
2014-04-21 13:26:00 60 first 240
2014-04-21 18:51:00 60 second 60
2014-04-21 20:56:00 60 second 120
2014-04-22 00:50:00 60 second 180
2014-04-22 06:52:00 60 first 60
2014-04-22 11:56:00 60 first 120
2014-04-22 19:12:00 60 second 60
2014-04-22 20:30:00 60 second 120
2014-04-23 00:55:00 60 second 180
2014-04-23 06:23:00 60 first 60
2014-04-23 09:19:00 60 first 120
2014-04-23 19:39:00 60 second 60
2014-04-23 22:11:00 60 second 120
2014-04-24 00:39:00 60 second 180
2014-04-24 00:42:00 60 second 240
2014-04-24 02:32:00 60 second 300
2014-04-24 06:59:00 60 first 60
2014-04-24 07:40:00 60 first 120
2014-04-24 16:03:00 60 first 180
2014-04-24 20:25:00 60 second 60
示例方案
CREATE TABLE Table1 (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
qty STRING,
tdate STRING,
shift STRING
);
INSERT Into Table1 values(NULL,'60','2014-05-16 08:38:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-16 00:15:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-16 15:48:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-16 19:46:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-16 21:44:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-17 00:25:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-17 03:45:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-15 06:02:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-15 08:40:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-15 11:05:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-15 13:48:00','first');
INSERT Into Table1 values(NULL,'6','2014-05-15 16:08:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-15 19:08:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-15 21:26:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-16 01:16:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-16 04:09:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-14 05:49:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-14 09:58:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-14 13:33:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-14 18:53:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-15 00:09:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-15 02:50:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 06:32:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-13 09:19:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-13 00:13:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 13:15:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-13 18:28:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 21:04:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 22:26:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-14 00:44:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-14 02:35:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-12 06:20:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-12 07:12:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-12 09:25:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-12 00:01:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-12 14:51:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-12 19:11:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-12 21:19:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 00:07:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-13 02:17:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-10 08:15:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-10 09:36:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-10 09:37:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-10 11:59:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-10 14:44:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-10 19:17:00','second');
INSERT Into Table1 values(NULL,'13','2014-05-10 21:43:00','second');
INSERT Into Table1 values(NULL,'58','2014-05-10 21:43:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-11 00:30:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-11 02:41:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-09 06:12:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-09 09:07:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-09 11:57:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-09 14:20:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-09 18:41:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-09 21:03:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-09 23:56:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-10 01:43:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-10 03:28:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-10 04:19:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-08 06:04:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-08 09:17:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-08 11:12:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-08 20:16:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-08 21:24:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-09 00:03:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-09 01:53:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-07 06:13:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-07 07:34:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-07 09:25:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-07 00:45:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-07 20:19:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-07 21:50:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-08 00:11:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-08 02:33:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-06 06:09:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-06 07:42:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-06 09:12:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-06 00:43:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-06 18:47:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-06 21:09:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-06 23:14:00','second');
INSERT Into Table1 values(NULL,'50','2014-05-06 23:16:00','second');
INSERT Into Table1 values(NULL,'61','2014-05-06 23:16:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-07 00:20:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-07 02:09:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-05 06:45:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-05 08:12:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-05 10:27:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-05 14:32:00','first');
INSERT Into Table1 values(NULL,'60','2014-05-05 19:46:00','second');
INSERT Into Table1 values(NULL,'60','2014-05-05 22:18:00','second');
答案 0 :(得分:0)
我认为你可以通过减去5个小时并将其作为比较日期来做你想做的事。这样,凌晨4点将与下午11点在同一“日”。之前的日期。我认为以下是在SQLite中做到的:
SELECT tdate, qty, shift,
(SELECT sum( b.qty )
FROM table1 AS b
WHERE b.id <= a.id AND b.shift = a.shift and
date(b.tdate, '-5 Hours') = date(a.tdate, '-5 Hours')
)
AS bo_total
FROM table1 AS a
ORDER BY date(a.tdate ) ASC, a.shift ASC;
答案 1 :(得分:0)
此查询首先计算班次开始的日期,这使得班次比较更容易:
WITH a AS
(SELECT ID,
qty,
tdate,
shift,
CASE
WHEN time(tdate) BETWEEN '05:30' AND '17:00'
THEN date(tdate) || ' first'
WHEN time(tdate) >= '17:30' THEN date(tdate) || ' second'
WHEN time(tdate) <= '05:00' THEN date(tdate, '-1 day') || ' second'
END AS ShiftID
FROM Table1)
SELECT tdate,
qty,
shift,
(SELECT sum(qty)
FROM a AS b
WHERE b.ShiftID = a.ShiftID
AND b.tdate <= a.tdate
) AS bo_total
FROM a
ORDER BY tdate
如果您的SQLite驱动程序早于3.8.3,请使用视图而不是CTE。