使用CASE时合并记录

时间:2015-09-08 15:39:25

标签: oracle11g

我希望在I.ITEMNUM ='505611'中看到1行中的所有记录而不是2行。列“D.RESTYPE”可以是APSOFT或APHARD。因此具有SUM函数的Case表达式。但是,我的输出显示为2行,因为有1个数量被分类为“APSOFT”,而数量43被归类为“APHARD”。请您的及时回复表示高度赞赏。仅供参考,这是在ORACLE。

SELECT   i.itemnum,
         CASE WHEN d.restype = 'APSOFT' THEN SUM (NVL (d.reservedqty, 0)) END
            AS "ALLOCATED",
         CASE WHEN d.restype = 'APHARD' THEN SUM (NVL (d.reservedqty, 0)) END
            AS "RESERVE"
FROM     mxrads.inventory n
         LEFT OUTER JOIN mxrads.item i ON i.itemnum = n.itemnum
         LEFT OUTER JOIN mscrads.invreserve d
            ON n.itemnum = d.itemnum AND n.location = d.location
WHERE        n.siteid <> 'MS'
         AND n.location = '&WHSE'
         AND n.status = 'ACTIVE'
         AND n.itemnum = '505611'
GROUP BY i.itemnum, d.restype

1 个答案:

答案 0 :(得分:1)

case需要在总和内而不是在其外部。完成此操作后,您就可以从d.restype条款中删除GROUP BY

     NVL (
        SUM (
           CASE WHEN d.restype = 'APSOFT' THEN d.reservedqty ELSE NULL END),
        0)
        AS "ALLOCATED",
     NVL (
        SUM (
           CASE WHEN d.restype = 'APHARD' THEN d.reservedqty ELSE NULL END),
        0)
        AS "RESERVE",

当您将案例放在外面时,它需要d.reservedqty的总和,然后根据d.retype中的值显示它。通过颠倒这一点,我们只是说&#34;仅对d.reservedqty的{​​{1}}的值求和,其中d.restype的对应值是指定值&#34;。