2015-09-16 7 views
5

मैं घंटों तक 24 घंटे समूहों के भीतर स्थिति की राशि का प्रयास कर रहा हूं। मेरे पास ऑर्डर, ऑर्डर स्टेटस और स्टेटस टेबल है।24 घंटे समूह के भीतर 2412 समूह के भीतर एसक्यूएल योग

आदेश तालिका:

+---------+-------------------------+ 
| 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 के भीतर की स्थिति की संख्या प्रदर्शित लिखने की कोशिश कर रहा हूँ घंटे के अनुसार समेकित अलग ऑर्डरिड के लिए घंटे:

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

यह मेरा एसक्यूएल अब तक है। मैं हर आदेश की स्थिति की राशि प्राप्त करने की कोशिश अटक कर रहा हूँ:

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

यहां आप जाते हैं - मैं आपके डेटा में त्रुटियों को अनदेखा कर रहा हूं क्योंकि यह स्थिति विफल हो जाएगी यदि स्थिति तालिका में वास्तव में आपके उदाहरण डेटा में डुप्लिकेट आईडी हों।

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

एसक्यूएल नहीं चलता है। स्थिति एक टेबल नाम है। क्या आपके पास चयन कथन में कॉलम के रूप में सूचीबद्ध स्थिति है? चयन DatePart (घंटा, o.orderdate) घंटे के रूप में, स्थिति, COUNT (DISTINCT o.orderid) – user1466907

+0

पहले एसक्यूएल से? या पिवट? क्या यह आपको एक त्रुटि दे रहा है? – Beth

संबंधित मुद्दे