簡體   English   中英

24小時內不同狀態的SQL總和按小時計算

[英]SQL sum of different status within 24 hrs group by hours

我試圖按小時在24小時組內總結狀態。 我有訂單,訂單狀態和狀態表。

訂單表:

+---------+-------------------------+
| orderid | orderdate               |
+---------+-------------------------+
| 1       | 2015-09-16 00:04:19.100 |
| 2       | 2015-09-16 00:01:19.490 |
| 3       | 2015-09-16 00:02:33.733 |
| 4       | 2015-09-16 00:03:58.800 |
| 5       | 2015-09-16 00:01:16.020 |
| 6       | 2015-09-16 00:01:16.677 |
| 7       | 2015-09-16 00:02:06.920 |
+---------+-------------------------+

訂單狀態表:

+---------+----------+
| orderid | statusid |
+---------+----------+
| 1       | 11       | 
| 2       | 22       |
| 3       | 22       |
| 4       | 11       |
| 5       | 22       |
| 6       | 33       |
| 7       | 11       |
+---------+----------+

狀態表:

+----------+----------+
| statusid | status   |
+----------+----------+
| 11       | PVC      |
| 22       | CCC      |
| 33       | WWW      |
|          |          |
+----------+----------+

我嘗試編寫SQL,顯示24小時內狀態的計數,以便按小時分組的不同訂單:

+------+-----+-----+-----+
| Hour | PVC | CCC | WWW |
+------+-----+-----+-----+
| 1    | 0   | 2   | 1   |
| 2    | 1   | 1   | 0   |
| 3    | 1   | 0   | 0   |
| 4    | 1   | 0   | 0   |
+------+-----+-----+-----+

到目前為止這是我的SQL。 我被困在試圖得到每個訂單狀態的總和:

SELECT
    DATEPART(hour, o.orderdate) AS Hour,
    SUM( 
        CASE (
            SELECT stat.status 
            FROM Status stat, orderstatus os  
            WHERE stat.status IN ('PVC') AND os.orderid = o.id AND os.statusid = stat.id
        ) 
            WHEN 'PVC' THEN 1 
            ELSE 0 
        END 
    ) AS PVC,
    SUM(
        CASE (
            SELECT stat.status 
            FROM Status stat, orderstatus os 
            WHERE stat.status IN ('WWW') AND os.orderid = o.id AND os.statusid = stat.id
        ) 
          WHEN 'CCC' THEN 1 
          ELSE 0 
        END 
    ) AS CCC,
    SUM( 
        CASE (
            SELECT stat.status 
            FROM Status stat, orderstatus os 
            WHERE stat.status IN ('CCC') AND os.orderid = o.id AND os.statusid = stat.id) 
            WHEN 'WWW' THEN 1 
            ELSE 0 
        END 
    ) AS WWW 
FROM orders o 
WHERE o.orderdate BETWEEN DATEADD(d,-1,CURRENT_TIMESTAMP) AND CURRENT_TIMESTAMP 
GROUP BY DATEPART(hour, o.orderdate) 
ORDER BY DATEPART(hour, o.orderdate);

這應該讓你更接近,然后你必須轉動:

SELECT 
   DATEPART(HOUR,o.orderdate) AS orderDate_hour, 
   s.status,
   COUNT(DISTINCT o.orderid) AS count_orderID
 FROM  
     orders o INNER JOIN
     orderstatus os ON
     o.orderid = os.orderid INNER JOIN
     status s ON
     os.statusid = s.statusid
WHERE 
    o.orderdate >= DATEADD(d,-1,CURRENT_TIMESTAMP)
GROUP BY 
    DATEPART(HOUR,o.orderdate) , s.status
ORDER BY 
    DATEPART(HOUR,o.orderdate)

試試這個樞軸:

SELECT 
    *
FROM
    (SELECT 
       DATEPART(HOUR,o.orderdate) AS orderDate_hour, 
       s.status,
       COUNT(DISTINCT o.orderid) AS count_orderID
     FROM  
         orders o INNER JOIN
         orderstatus os ON
         o.orderid = os.orderid INNER JOIN
         status s ON
         os.statusid = s.statusid
    WHERE 
        o.orderdate >= DATEADD(d,-1,CURRENT_TIMESTAMP) 
    GROUP BY 
        DATEPART(HOUR,o.orderdate) , s.status) s
PIVOT ( MAX(count_orderID) FOR status    IN ('pvc','ccc','www')) AS p
ORDER BY 
    orderDate_hour 

在這里 - 我忽略了數據中的錯誤,因為如果狀態表確實有像您的示例數據中那樣的重復ID,則會失敗。

SELECT hour, sum(PVC) as PVC, sum(CCC) as CCC, sum(WWW) as WWW
from (
  select datepart(hour,orderdate) as hour, 
        case when s.status = 'PVC' then 1 else 0 end as PVC,
        case when s.status = 'CCC' then 1 else 0 end as CCC,
        case when s.status = 'WWW' then 1 else 0 end as WWW
  from order o 
  join orderstatus os on o.orderid = os.orderid
  join status s on s.statusid = os.statusid
) sub
group by hour

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM