2015-09-16 25 views
5

我試圖在24小時內按小時計算狀態總和。我有一個訂單,訂單狀態和狀態表。24小時內不同狀態的SQL總和按小時計算

順序表:

+---------+-------------------------+ 
| 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顯示的狀態計數按小時分組的不同orderids的小時數如下:

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

你的狀態表是否有錯誤...它有11次3次不同的值。 – Hogan

+0

我糾正了這一點。謝謝。 – user1466907

回答

0

這裏你去 - 我忽略了你的數據中的錯誤,因爲如果狀態表在你的示例數據中確實有重複的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 
+0

這對我有效。非常感謝 – user1466907

0

這應該讓你更接近,那麼你必須支點:

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

我會嘗試一下,讓你知道。非常感謝您的時間和考慮。 – user1466907

+0

sql不運行。狀態是一個表名。你是否想將select語句中的狀態列爲列? SELECT DATEPART(HOUR,o.orderdate)AS HOUR, 狀態, COUNT(DISTINCT o.orderid) FROM – user1466907

+0

第一個SQL?或樞軸?它給你一個錯誤? – Beth