Sql server 是否有方法计算列数,如果大于1,则检查B列是否满足条件跳过
我正在编写一个SQL查询,其中我试图查找任何具有禁用信用卡的帐户,该帐户的文件中没有第二张活动卡。使用Select Distinct,我可以将其下放到各个行,但我不知道如何编写案例。我在想我可以使用计数来计数行,如果其中一行被列为活动行,那么一起跳过记录。因此,如果帐号显示两次,请检查其中一行是否处于活动状态,如果是,请跳过该帐号 正如我提到的,我可以解析出原始数据并提取帐户上的所有内容,但后半部分我无法完成。一般来说,我对SQL和编码相当陌生Sql server 是否有方法计算列数,如果大于1,则检查B列是否满足条件跳过,sql-server,Sql Server,我正在编写一个SQL查询,其中我试图查找任何具有禁用信用卡的帐户,该帐户的文件中没有第二张活动卡。使用Select Distinct,我可以将其下放到各个行,但我不知道如何编写案例。我在想我可以使用计数来计数行,如果其中一行被列为活动行,那么一起跳过记录。因此,如果帐号显示两次,请检查其中一行是否处于活动状态,如果是,请跳过该帐号 正如我提到的,我可以解析出原始数据并提取帐户上的所有内容,但后半部分我无法完成。一般来说,我对SQL和编码相当陌生 SELECT DISTINCT dbo.
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
54321 Name INSTALLMENT Status Active Disabled
我怀疑这会让你得到答案,如果不是的话,也会让你接近答案。你感兴趣的是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,但您应该有足够的内容来完成。如果您添加一些示例数据和预期输出,那就太好了。请显示示例数据和所需结果,这些比不满足您需要的查询有用得多。:-这很奇怪,我这里有示例代码。让我来研究一下预期产出。似乎你所追求的是一个条件聚合;这在T-SQL中是可能的。@RDBCruzer示例代码对于包含在问题中很重要。样本数据和基于该样本数据的期望输出(作为问题中的文本,而不是屏幕截图)同样重要。
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];