SQL เข้าร่วมกับผลรวม

สวัสดี ฉันมี SQL Query ต่อไปนี้ซึ่งให้ผลลัพธ์ดังต่อไปนี้

SELECT * FROM
     (
     Select
        catalogid, numitems, allitems - numitems ignoreditems
     from
         ( 
             select
                 i.catalogid,
                 case
                     when Exists(select paymentodate from payentmethodvalidation q where q.paymentnoodate = o.ocardtype) AND NOT EXISTS(SELECT booked FROM bookedordersids m where CAST(m.booked AS int)=o.orderid) then sum(i.numitems)
                     when Exists(select paymentodate from payentmethodvalidation q where q.paymentodate = o.ocardtype) AND odate is not null AND NOT EXISTS(SELECT booked FROM bookedordersids m where CAST(m.booked AS int)=o.orderid) then sum(i.numitems)
                 else 0 end numitems,
                 sum(numitems) allitems 
             from 
                 "orders o
             inner join
                 "oitems i 
             on 
                 "i.orderid=o.orderid
             inner join
                 "products T1
             on 
                 "T1.catalogid = i.catalogid
             group by 
                 "i.catalogid, ocardtype, odate,o.orderid
         ) A
     ) B
     INNER JOIN
     (
         SELECT 
             catalogId, 
             ProcessedSucssessfully = 
                STUFF((SELECT ', ' + CAST( b.orderid as varchar(10))
                       FROM oitems b JOIN orders o ON b.orderid = o.orderid 
                       WHERE b.catalogId = a.catalogId 
                       AND  NOT EXISTS(SELECT booked FROM bookedordersids m where CAST(m.booked AS int)=o.orderid) AND (Exists(select paymentodate from payentmethodvalidation q where q.paymentnoodate = o.ocardtype) OR Exists(select paymentodate from payentmethodvalidation q where q.paymentodate = o.ocardtype) and o.odate is not null)
                       FOR XML PATH('')), 1, 2, ''), 
                           "NotProcessed = 
                 STUFF((SELECT ', ' + CAST( c.orderid as varchar(10))
                        FROM oitems c JOIN orders o ON c.orderId = o.orderid
                        WHERE c.catalogid = a.catalogid 
                        AND (o.ocardtype in ('mastercard') OR o.ocardtype is null) and o.odate is null
                        FOR XML PATH('')), 1, 2, '') 
         FROM 
             oitems a 
         GROUP BY 
             a.catalogid 
     )C
         ON 
             B.catalogid = C.catalogid 

ผลลัพธ์ของแบบสอบถามนี้คุณสามารถดูได้ในภาพต่อไปนี้ ป้อนคำอธิบายรูปภาพที่นี่

คุณเห็นแถววงกลม 2 แถวนั้น ฉันต้องการให้พวกมันอยู่ในแถวเดียวที่จะรวมเฉพาะตัวเลขเท่านั้น การประมวลผลค่าสำเร็จและค่าอื่น ๆ ทั้งหมดจะเหมือนกันเสมอสำหรับบันทึกในแค็ตตาล็อกที่ใช้ร่วมกัน ดังนั้นจึงไม่มีปัญหากับพวกเขา

โดยพื้นฐานแล้วแถวผลลัพธ์ควรมีผลรวมของค่า numitem ในทุกแถวที่มีแคตตาล็อกเดียวกัน

แล้วฉันจะแก้ไขปัญหานี้ได้อย่างไร?


person user1570048    schedule 14.10.2012    source แหล่งที่มา


คำตอบ (1)


ตามที่คุณกล่าวไว้ หากค่าที่เหลือทั้งหมดเหมือนกัน วิธีแก้ไขก็ง่ายมาก:

SELECT CATALOGID, 
       Sum(NUMITEMS), 
       ALLITEMS - NUMITEMS ignoreditems 
FROM   (SELECT CATALOGID, 
               NUMITEMS, 
               ALLITEMS - NUMITEMS ignoreditems 
        FROM   (SELECT i.CATALOGID, 
                       CASE 
                         WHEN EXISTS(SELECT PAYMENTODATE 
                                     FROM   PAYENTMETHODVALIDATION q 
                                     WHERE  q.PAYMENTNOODATE = o.OCARDTYPE) 
                              AND NOT EXISTS(SELECT BOOKED 
                                             FROM   BOOKEDORDERSIDS m 
                                             WHERE  Cast(m.BOOKED AS 
                                                    INT) = o.ORDERID) 
                       THEN 
                         Sum(i.NUMITEMS) 
                         WHEN EXISTS(SELECT PAYMENTODATE 
                                     FROM   PAYENTMETHODVALIDATION q 
                                     WHERE  q.PAYMENTODATE = o.OCARDTYPE) 
                              AND ODATE IS NOT NULL 
                              AND NOT EXISTS(SELECT BOOKED 
                                             FROM   BOOKEDORDERSIDS m 
                                             WHERE  Cast(m.BOOKED AS 
                                                    INT) = o.ORDERID) 
                       THEN 
                         Sum(i.NUMITEMS) 
                         ELSE 0 
                       END           numitems, 
                       Sum(NUMITEMS) allitems 
                FROM   ORDERS o 
                       INNER JOIN OITEMS i 
                               ON i.ORDERID = o.ORDERID 
                       INNER JOIN PRODUCTS T1 
                               ON T1.CATALOGID = i.CATALOGID 
                GROUP  BY i.CATALOGID, 
                          OCARDTYPE, 
                          ODATE, 
                          o.ORDERID) A) B 
       INNER JOIN (SELECT CATALOGID, 
                          ProcessedSucssessfully = Stuff( 
                          (SELECT ', ' + Cast( b.ORDERID 
                                  AS VARCHAR 
                                  (10)) 
                           FROM   OITEMS b 
                                  JOIN ORDERS o 
                                    ON 
                          b.ORDERID = o.ORDERID 
                           WHERE  b.CATALOGID = 
                                  a.CATALOGID 
                                  AND NOT 
                          EXISTS(SELECT BOOKED 
                                 FROM   BOOKEDORDERSIDS 
                                        m 
                                 WHERE 
                          Cast( 
                                m.BOOKED AS 
                          INT) = o.ORDERID) 
                                  AND ( EXISTS 
                                  (SELECT PAYMENTODATE 
                                   FROM 
                                        PAYENTMETHODVALIDATION q 
                                               WHERE 
                                  q.PAYMENTNOODATE = 
                                  o.OCARDTYPE) 
                                         OR EXISTS 
                                        (SELECT 
                                            PAYMENTODATE 
                                                   FROM 
                                            PAYENTMETHODVALIDATION 
                                            q 
                                                   WHERE 
                                        q.PAYMENTODATE = 
                  o.OCARDTYPE) 
                  AND o.ODATE IS NOT NULL ) 
                  FOR XML PATH('')), 1, 2, ''), 
                  NotProcessed = Stuff((SELECT ', ' + Cast( c.ORDERID AS VARCHAR 
                                               (10)) 
                  FROM   OITEMS c 
                  JOIN ORDERS o 
                  ON c.ORDERID = o.ORDERID 
                  WHERE  c.CATALOGID = a.CATALOGID 
                  AND ( o.OCARDTYPE IN ( 'mastercard' ) 
                  OR o.OCARDTYPE IS NULL ) 
                  AND o.ODATE IS NULL 
                  FOR XML PATH('')), 1, 2, '') 
                   FROM   OITEMS a 
                   GROUP  BY a.CATALOGID)C 
               ON B.CATALOGID = C.CATALOGID 
GROUP  BY CATALOGID, 
          ALLITEMS - NUMITEMS 
person Gidil    schedule 14.10.2012