2015-09-16 12 views
5

Saat cinsinden 24 saat içinde durumu toplamayı deniyorum. Siparişim, sipariş durumu ve durum tablom var.Saat başına 24 saat içinde farklı durum SQL toplamı

al Tablo:

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

Sipariş Durumu Tablo:

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

Durum Tablosu: Ben 24 içinde durumu sayısını görüntüler SQL yazmayı deneyin duyuyorum

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

saat gibi gruplandırılmış farklı orderidler için saat:

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

Bu benim SQL'im şimdiye kadar. Her sipariş durumu toplamını almaya çalışırken takılıp am:

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) 

pivot bu deneyin:

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

Durum tablonuzda bir hata var ... 11 farklı değere sahip 3 kez var. – Hogan

+0

Bunu düzeltdim. Teşekkürler. – user1466907

cevap

0

Buradan başlıyorsunuz - veri tablonuzun örnek verilerinizde olduğu gibi yinelenen kimlikleri olması durumunda bu başarısızlıkla sonuçlanacağından verilerinizdeki hataları görmezden geliyorum.

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

dan * seçmek için değiştirirseniz, bu benim için çalıştı. Çok teşekkürler – user1466907

0

bu yaklaştırır almalısınız, o zaman eksen zorunda

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

Denerim ve size bildiririm. Zaman ayırdığınız ve düşündüğünüz için çok teşekkür ederim. – user1466907

+0

sql çalışmıyor. durum bir tablo adıdır. Seçme ifadesinde bir sütun olarak listelenen durum var mı demek istediniz? SAAT OLARAK SEÇ DATEPART (SAAT, o.orderdate), durumu, COUNT (DISTINCT o.orderid) – user1466907

+0

ilk sql GELEN ? veya pivot? size bir hata mı veriyor? – Beth