[英]SQL query hourly report?
我有一個艱難的人在這里毆打我。 我們有一個生產各種產品的生產倉庫,我們使用以下查詢發送每日生產報告,但我希望每小時進行一次排序:
(我將查詢精簡為僅幾個產品,因為它相當大:
SET
@DayStart = '2013-10-24 07:00:00',
@DayEnd = '2013-10-24 16:00:00';
SELECT
(SELECT COUNT(*) FROM t_container
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '3'
) AS Product1,
(SELECT CONCAT (
(SELECT COUNT(*) FROM t_container
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '10'
AND status_id = '4'
) , ' / ' ,
(SELECT COUNT(*) FROM t_container
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '10'
AND status_id = '6'
))
) AS 'Product 1 EOL',
(SELECT COUNT(*) FROM t_container
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '2'
) AS 'Product 2',
(SELECT COUNT(*) FROM t_container
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '6'
) AS 'Product 3',
(SELECT CONCAT (
(SELECT COUNT(*) FROM t_container
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '9'
AND status_id = '4'
) , ' / ' ,
(SELECT COUNT(*) FROM t_container
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '9'
AND status_id = '6'
))
) AS 'Product 3 EOL',
(SELECT COUNT(*) FROM t_container
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '4'
) AS 'Product 4',
(SELECT CONCAT (
(SELECT COUNT(*) FROM t_container
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '8'
AND status_id = '4'
) , ' / ' ,
(SELECT COUNT(*) FROM t_container
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '8'
AND status_id = '6'
))
) AS 'Product 4 EOL'
我想實現的是運行以上報告,但輸出以1小時為增量。
任何幫助將不勝感激。
請參見下面的“預期輸出示例”
時間| 產品1 | 產品1停產| 產品2 | 產品3
07:00 | 12345 | 1/1 | 1568789 | 1/1
08:00 | 12345 | 1/1 | 1568789 | 1/1
09:00 | 12345 | 1/1 | 1568789 | 1/1
您有一行包含很多子選擇
我很想將它們重新編碼為子選擇,然后再將它們加入到單行中(或僅返回多行並按照顯示代碼的格式進行格式化)。
但是,要將這些子選擇之一分成幾個小時,您可以使用類似以下內容(未經測試):-
SELECT StartHour, COUNT(*)
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN Sub2.StartHour AND DATE_ADD(Sub2.StartHour, INTERVAL 3599 SECOND)
WHERE created_timestamp BETWEEN @DayStart AND @DayEnd
AND container_type_id = '3'
GROUP BY StartHour
通過添加開始日期來設置小時范圍,然后使用該范圍對您的數據進行左連接(添加3599秒以獲取小時結束時間段),並進行分組計數,在開始時間的GROUP BY。
編輯
未經測試,但這是一種實現方法:-
SELECT StartHour,
EndHour,
COUNT(DISTINCT a.id) AS Product1,
COUNT(DISTINCT b.id) AS 'Product 1 EOL 1',
COUNT(DISTINCT c.id) AS 'Product 1 EOL 2',
COUNT(DISTINCT d.id) AS 'Product 2',
COUNT(DISTINCT e.id) AS 'Product 3',
COUNT(DISTINCT f.id) AS 'Product 3 EOL 1',
COUNT(DISTINCT g.id) AS 'Product 3 EOL 2',
COUNT(DISTINCT h.id) AS 'Product 4',
COUNT(DISTINCT i.id) AS 'Product 4 EOL 1',
COUNT(DISTINCT j.id) AS 'Product 4 EOL 2'
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container a
ON a.created_timestamp BETWEEN Sub2.StartHour AND Sub2.EndHour
AND a.container_type_id = '3'
LEFT OUTER JOIN t_container b
ON b.created_timestamp BETWEEN Sub2.StartHour AND Sub2.EndHour
AND b.container_type_id = '10'
AND b.status_id = '4'
LEFT OUTER JOIN t_container c
ON c.created_timestamp BETWEEN Sub2.StartHour AND Sub2.EndHour
AND c.container_type_id = '10'
AND c.status_id = '6'
LEFT OUTER JOIN t_container d
ON d.created_timestamp BETWEEN Sub2.StartHour AND Sub2.EndHour
AND d.container_type_id = '2'
LEFT OUTER JOIN t_container e
ON e.created_timestamp BETWEEN Sub2.StartHour AND Sub2.EndHour
AND e.container_type_id = '6'
LEFT OUTER JOIN t_container f
ON f.created_timestamp BETWEEN Sub2.StartHour AND Sub2.EndHour
AND f.container_type_id = '9'
AND f.status_id = '4'
LEFT OUTER JOIN t_container g
ON g.created_timestamp BETWEEN Sub2.StartHour AND Sub2.EndHour
AND g.container_type_id = '9'
AND g.status_id = '6'
LEFT OUTER JOIN t_container h
ON h.created_timestamp BETWEEN Sub2.StartHour AND Sub2.EndHour
AND h.container_type_id = '4'
LEFT OUTER JOIN t_container i
ON i.created_timestamp BETWEEN Sub2.StartHour AND Sub2.EndHour
AND i.container_type_id = '8'
AND i.status_id = '4'
LEFT OUTER JOIN t_container j
ON j.created_timestamp BETWEEN Sub2.StartHour AND Sub2.EndHour
AND j.container_type_id = '8'
AND j.status_id = '6'
GROUP BY StartHour, EndHour
這樣做是進行1次子選擇以獲取所有小時時間段,然后將表重新連接以獲取計數。 但是,使用這么多的COUNT(DISTINCT))類型的語句可能效果不佳。
可能有可能進行聯接以獲取每個子選擇中的小時范圍,然后再聯接回去,這可能更好。
請注意,我為以前有2個值(用/分隔)的列帶回了2列。
可能稍好(但也可能稍差):-
SELECT Product1.rec_cnt AS Product1,
CONCAT(Product1EOL1.rec_cnt, ' / ', Product1EOL2.rec_cnt) AS 'Product 1 EOL',
Product2.rec_cnt AS 'Product 2',
Product3.rec_cnt AS 'Product 3',
CONCAT(Product3EOL1.rec_cnt, ' / ', Product3EOL2.rec_cnt) AS 'Product 3 EOL',
Product4.rec_cnt AS 'Product 4',
CONCAT(Product4EOL1.rec_cnt, ' / ', Product4EOL2.rec_cnt) AS 'Product 4 EOL'
FROM
(
SELECT StartHour, EndHour, COUNT(t_container.id) AS rec_cnt
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN StartHour AND EndHour
AND container_type_id = '3'
GROUP BY StartHour, EndHour
) AS Product1
INNER JOIN
(
SELECT StartHour, EndHour, COUNT(t_container.id) AS rec_cnt
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN StartHour AND EndHour
AND container_type_id = '10'
AND status_id = '4'
GROUP BY StartHour, EndHour
) AS Product1EOL1
ON Product1.StartHour = Product1EOL1.StartHour AND Product1.EndHour = Product1EOL1.EndHour
INNER JOIN
(
SELECT StartHour, EndHour, COUNT(t_container.id) AS rec_cnt
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN StartHour AND EndHour
AND container_type_id = '10'
AND status_id = '6'
GROUP BY StartHour, EndHour
) AS Product1EOL2
ON Product1.StartHour = Product1EOL2.StartHour AND Product1.EndHour = Product1EOL2.EndHour
INNER JOIN
(
SELECT StartHour, EndHour, COUNT(t_container.id) AS rec_cnt
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN StartHour AND EndHour
AND container_type_id = '2'
GROUP BY StartHour, EndHour
) AS Product2
ON Product1.StartHour = Product2.StartHour AND Product1.EndHour = Product2.EndHour
INNER JOIN
(
SELECT StartHour, EndHour, COUNT(t_container.id) AS rec_cnt
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN StartHour AND EndHour
AND container_type_id = '6'
GROUP BY StartHour, EndHour
) AS Product3
ON Product1.StartHour = Product3.StartHour AND Product1.EndHour = Product3.EndHour
INNER JOIN
(
SELECT StartHour, EndHour, COUNT(t_container.id) AS rec_cnt
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN StartHour AND EndHour
AND container_type_id = '9'
AND status_id = '4'
GROUP BY StartHour, EndHour
) AS Product3EOL1
ON Product1.StartHour = Product3EOL1.StartHour AND Product1.EndHour = Product3EOL1.EndHour
INNER JOIN
(
SELECT StartHour, EndHour, COUNT(t_container.id) AS rec_cnt
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN StartHour AND EndHour
AND container_type_id = '9'
AND status_id = '6'
GROUP BY StartHour, EndHour
) AS Product3EOL2
ON Product1.StartHour = Product3EOL2.StartHour AND Product1.EndHour = Product3EOL2.EndHour
INNER JOIN
(
SELECT StartHour, EndHour, COUNT(t_container.id) AS rec_cnt
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN StartHour AND EndHour
AND container_type_id = '4'
GROUP BY StartHour, EndHour
) AS Product4
ON Product4.StartHour = Product3.StartHour AND Product4.EndHour = Product3.EndHour
INNER JOIN
(
SELECT StartHour, EndHour, COUNT(t_container.id) AS rec_cnt
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN StartHour AND EndHour
AND container_type_id = '8'
AND status_id = '4'
GROUP BY StartHour, EndHour
) AS Product4EOL1
ON Product1.StartHour = Product4EOL1.StartHour AND Product1.EndHour = Product4EOL1.EndHour
INNER JOIN
(
SELECT StartHour, EndHour, COUNT(t_container.id) AS rec_cnt
FROM
(
SELECT DATE_ADD(@DayStart, INTERVAL i HOUR) AS StartHour, DATE_ADD(DATE_ADD(@DayStart, INTERVAL i HOUR), INTERVAL 3599 SECOND) AS EndHour
FROM
(
SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
) Sub1
) Sub2
LEFT OUTER JOIN t_container
ON created_timestamp BETWEEN StartHour AND EndHour
AND container_type_id = '8'
AND status_id = '6'
GROUP BY StartHour, EndHour
) AS Product4EOL2
ON Product1.StartHour = Product4EOL2.StartHour AND Product1.EndHour = Product4EOL2.EndHour
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.