oracle case语句中的多个条件

时间:2018-03-15 13:08:29

标签: oracle

我在达到要求时遇到了一些麻烦。我有一个名为accounts_invoice的表和下面提到的数据。

数据库表

Text {
    id: txt;
    text: qsTr("First Login and then try again");
}

我已编写如下代码,但根据我的要求,我的输出似乎不正确。

AC_NO   VARCHAR2(20 BYTE)               
INV_NO  VARCHAR2(20 BYTE)           
CC  VARCHAR2(20 BYTE)               
FT  VARCHAR2(20 BYTE)           

AC_NO  INV_NO   CC      FT
-----------------------------
1   A   PTN INVOICE
1   A   PTN BDE
2   B   ABC INVOICE
2   B   PTN INVOICE
2   B   PTN BDE

输出

SELECT
    ac_no,
    CASE WHEN FT like '%INVOICE%' THEN 'AVAILABLE' else 'NOTAVAILABLE'
END AS INVOICE,
        CASE WHEN FT like '%BDE%' THEN 'AVAILABLE' else 'NOTAVAILABLE' END AS BDE
FROM Account_info
where CC='PTN';

我期待输出如下: 但输出应该是

1   A   Available   Notavailable
1   A   Notavailable    Available
2   B   Available   Notavailable
2   B   Notavailable    Available

请帮帮我,我怎样才能达到上述效果。

2 个答案:

答案 0 :(得分:1)

略微修改的数据透视查询应该有效:

SELECT
    AC_NO,
    CASE WHEN COUNT(CASE WHEN FT = 'INVOICE' THEN 1 END) > 0
         THEN 'AVAILABLE' ELSE 'NOTAVAILABLE' END AS INVOICE,
    CASE WHEN COUNT(CASE WHEN FT = 'BDE' THEN 1 END) > 0
         THEN 'AVAILABLE' ELSE 'NOTAVAILABLE' END AS BDE
FROM yourTable
GROUP BY AC_NO

enter image description here

在这种情况下,我们将计数包装在第二个CASE表达式中,以检查发票和bde是否存在。

答案 1 :(得分:0)

这是另一种方法,不确定哪种方式会有更好的表现。此外,FT ='INVOICE'肯定会更好,但我不确定你的数据是否确实需要像'%INVOICE%'这样的FT。我只是保持这种方式。

SELECT 
  a1.AC_NO,
  NVL((select 'AVAILABLE' from ACCOUNT_INFO a
   where a.AC_NO=a1.AC_NO and a.FT like '%INVOICE%'
    and rownum=1
  ),'NOTAVAILABLE') as INVOICE,
  NVL((select 'BDE' from ACCOUNT_INFO a
   where a.AC_NO=a1.AC_NO and a.FT like '%BDE%'
    and rownum=1
  ),'NOTAVAILABLE') as BDE
FROM (
  SELECT DISTINCT AC_NO
  FROM ACCOUNT_INFO 
  WHERE CC='PTN'
) a1