2013-10-24 116 views
1

我有點難過,在這裏打我。我們有一個生產各種產品的生產倉庫,我們使用以下查詢發送每日生產報告,但我希望按小時排序:SQL查詢每小時報告?

(我只將少數產品的查詢修剪爲相當一個大問題:

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小時增量

任何援助將不勝感激

請參閱。在「e xpected output example「

TIME |產品1 |產品1 EOL |產品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的

+1

*旁註:*'container_type_id'是字符串?爲什麼用引號括起價值? – Raptor

+0

那就是我被教導編寫sql查詢的方式。 – Stroes

+0

舉例說明您的預期產出。 – crafter

回答

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 
+0

嗨wouldnt上述然後只是爲其中一個產品?僅供參考sql腳本中,我不是最有天賦的人,但熱衷於學習。 – Stroes

+0

是的,這只是其中的一種選擇,您需要爲所有產品執行類似操作。但是這會帶來多行,所以您真的需要在連接的子查詢中執行此操作。如果有幫助,我會有更多的戲。 – Kickstart

+0

我已經看過查詢,並確實做了我需要它做的事情!謝謝,只需要弄清楚如何加入子查詢,如您所述將所有數據放在一行中。這對我來說有點新的領域,所以建議非常感謝。 – Stroes