2012-10-14 23 views
0

你好,我已經產生以下結果SQL加入

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 

下面的SQL查詢的這個查詢,你可以在下面的圖片中看到的結果 enter image description here

你看那些2盤旋的行,我希望他們在一個行中,只會將numitems,處理成功的價值和所有其他值將始終相同的記錄共享catalogid所以沒有問題與他們。

basicly結果行應該在具有相同採用catalogId

那麼,如何解決這個問題的所有行的numitem valuse的總和?

回答

0

如果真如你所說,值的所有其餘的都是一樣的,解決方法很簡單:

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

上心謝謝:) – user1570048