如何使用来自多行的if语句显示组合结果?

时间:2018-01-29 21:05:48

标签: sql oracle

我在数据库中有下表(屏幕截图),其中记录了在APP_NAME特定日期打开的缺陷的批准状态为T1_APPROVAL。

我想在特定日期每个APP_NAME只显示一行。 例如。如果所有T1_APPROVAL =' Y'其中APP_NAME =' LS-OMS'它应显示已批准,否则待处理。

这是我到目前为止大致准备的,但没有给出预期的结果。

  SELECT DISTINCT
     CASE WHEN t1_approval <> 'Y' THEN 'Pending' ELSE 'Approved' END
         AS status
 FROM DAV_CR_DEFECT_DPLOYMENT_STATUS
WHERE TRUNC (deploy_date) = TO_DATE ('24-JAN-2018', 'dd-mon-yyyy')
GROUP BY (t1_approval);

如果你看截图,IOMIP有一个条目为N,1个条目为Y - 它应显示为PENDING;对于LS-OMS,所有T1_APPROVAL都是Y - 它应该显示为APPROVED。

这是我的最终结果,应该显示如下:

   APP_NAME |  T1_APPROVAL
   ======================
    IOMIP   |  PENDING
    LS-OMS  |  APPROVED

enter image description here

4 个答案:

答案 0 :(得分:1)

你想要一个group by和一些条件逻辑:

SELECT TRUNC(deploy_date), app_name, 
       (CASE WHEN MIN(TL_APPROVAL) = 'Y' THEN 'Approved' ELSE 'Pending' END) as status
FROM DAV_CR_DEFECT_DPLOYMENT_STATUS
GROUP BY TRUNC(deploy_date), app_name;

答案 1 :(得分:1)

对内部查询中的每个T1_APPROVAL计算N = APP_NAME的计数,如果为0 =&gt; PENDING其他APPROVED

SELECT A.DEPLOY_DATE, A.APP_NAME,
CASE WHEN A.PENDING_ENTRIES = 0 THEN 'APPROVED' ELSE 'PENDING' END AS T1_APPROVAL
FROM
    (SELECT TRUNC(DEPLOY_DATE) AS DEPLOY_DATE, APP_NAME,
    SUM(CASE WHEN T1_APPROVAL = 'N' THEN 1 ELSE 0 END) AS PENDING_ENTRIES
    FROM DAV_CR_DEFECT_DPLOYMENT_STATUS
    GROUP BY TRUNC(DEPLOY_DATE), APP_NAME) A;

答案 2 :(得分:1)

SELECT APP_NAME,
       CASE
           WHEN AVG(ASCII(T1_APPROVAL)) = ASCII('Y')
           THEN 'APPROVED'
           ELSE 'PENDING'
       END AS T1_APPROVAL
FROM DAV_CR_DEFECT_DPLOYMENT_STATUS
WHERE TRUNC(deploy_date) = TO_DATE('24-JAN-2018', 'dd-mon-yyyy')
GROUP BY APP_NAME

试试......这是漫长的一天,我可能会忘记一些愚蠢的事情。

*编辑:忘记将日期选择条款放入。

答案 3 :(得分:0)

你也可以使用MIN,

SELECT APP_NAME,
       DECODE(MIN(T1_APPROVAL), 'Y', 'APPROVED', 'PENDING')
  FROM DAV_CR_DEFECT_DPLOYMENT_STATUS
 WHERE TRUNC(deploy_date) = TO_DATE('24-JAN-2018', 'dd-mon-yyyy')
 GROUP BY APP_NAME