我在达到要求时遇到了一些麻烦。我有一个名为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
请帮帮我,我怎样才能达到上述效果。
答案 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
在这种情况下,我们将计数包装在第二个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