2015-09-16 9 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  | 
|   |   | 
+----------+----------+ 

私は24内の状態の数を表示するSQLを記述しようとしています次のように時間別に分類された個別のオーダーIDの時間:

+------+-----+-----+-----+ 
| 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は実行されません。 statusはテーブル名です。 selectステートメントに列としてステータスが表示されていることを意味しましたか? HOUR AS SELECT DATEPART(HOUR、o.orderdate)、 状態、 COUNT(DISTINCT o.orderid) – user1466907

+0

最初のSQLから ?またはピボット?それはあなたにエラーを与えていますか? – Beth