我正在编写一个SQL查询,试图在其中查找任何已禁用信用卡且没有第二张活动卡的帐户。使用Select Distinct,我可以将其分解为单独的行,但是我不知道如何编写Case。我当时想我可以使用一个计数来对行进行计数,如果其中某行被列为“活动”,则一起跳过记录。因此,如果帐号显示两次,请检查其中一行是否处于活动状态,如果是,请跳过该帐号。
正如我提到的,我可以解析原始数据并提取帐户中的所有内容,但后半部分使我难以理解。一般来说,我对SQL和编码还很陌生。
SELECT DISTINCT dbo.loanacct.column,
CASE dbo.account.status
When '0' then 'Active'
When '1' then 'Closed'
End AS 'Account Status',
dbo.loanacct.total_past_due_balance,
Case dbo.card.status
When '0' then 'Active'
when '1' then 'Disabled'
When '2' then 'Expired'
END AS 'Card Status'
FROM dbo.loanacct
Where Loan_group = 'Group'
AND dbo.loanacct.status_code = 'Status Code'
AND dbo.loanacct.total_past_due_balance <> '0.00'
AND dbo.loanacct.status_code_no = '0'
OR dbo.loanacct_Card_Status IS NU
当前输出看起来像这样:
Acct# Customer Name Group Status Code Acct Status Card Status
12345 Name INSTALLMENT Status Active Active
12345 NAME INSTALLMENT Status Active Disabled
我想做的是,当上述示例为true时,同一个帐户#但文件上有一个活动卡,该帐户将被跳过,而我在下一个帐户#上将得到一行返回没有存档的活动卡。
Acct# Customer Name Group Status Code Acct Status Card Status
54321 Name INSTALLMENT Status Active Disabled
答案 0 :(得分:0)
我怀疑这会为您提供答案,或者如果您不满意的话。您感兴趣的aprt是CASE
表达式。这还假设54321
对于帐号是错误的,应该为12345
。如果您有意反转该值,请参阅旁边的注释。
SELECT Acct#, --REVERSE(Acct#)? See comment
[Customer Name], --it's actually advised against having spaces, and other special characters, in your object names
[Group Status], --as you then are forced to always quote them; and that can "break" things if poorly handled.
Code,
[Acct Status],
CASE COUNT(CASE [Card Status] WHEN 'Disabled' THEN 1 END) > 0 THEN 'Disabled' ELSE 'Active'
FROM ...
GROUP BY Acct#,
[Customer Name],
[Group Status],
Code,
[Acct Status];
我没有在此处包括FROM
和WHERE
,但是您应该有足够的填写空间。