SQL查看表中的两列或多列是否大于0
我遇到了一个小问题,非常感谢您的帮助 我的桌子是这样的:SQL查看表中的两列或多列是否大于0,sql,sql-server,select,Sql,Sql Server,Select,我遇到了一个小问题,非常感谢您的帮助 我的桌子是这样的: CASH | CREDIT CARD | DEBIT CARD | ACCOUNT | OTHER ------------------------------------------------- 0.00 0.00 0.00 0.00 0.00 1.00 0.00 0.00 0.00 0.00 2.00 1.00
CASH | CREDIT CARD | DEBIT CARD | ACCOUNT | OTHER
-------------------------------------------------
0.00 0.00 0.00 0.00 0.00
1.00 0.00 0.00 0.00 0.00
2.00 1.00 0.00 0.00 0.00
我的目标是从上述任何一行中选择*0,该行有多个列>0
因此,在这个场景中,将使用上表选择第三行。我更喜欢,但作为练习,我决定尝试将其作为一个轴,后跟一个轴,这样我们就可以使用更多的通用SQL工具来编写它:
SELECT
[CASH], [CREDIT CARD], [DEBIT CARD], [ACCOUNT], [OTHER]
FROM table
WHERE
CASE WHEN [CASH] > 0 THEN 1 ELSE 0 END+
CASE WHEN [CREDIT CARD] > 0 THEN 1 ELSE 0 END+
CASE WHEN [DEBIT CARD] > 0 THEN 1 ELSE 0 END+
CASE WHEN [ACCOUNT] > 0 THEN 1 ELSE 0 END+
CASE WHEN [OTHER] > 0 THEN 1 ELSE 0 END >= 2
declare @t table (SomeID int,Cash money,Credit money,Debit money,Account money,Other money)
insert into @t(SomeID,Cash,Credit,Debit,Account,Other) values
(1,0.00,0.00,0.00,0.00,0.00),
(2,1.00,0.00,0.00,0.00,0.00),
(3,2.00,1.00,0.00,0.00,0.00)
;With Unpiv as (
select *,SUM(CASE WHEN MoneyValue > 0.00 THEN 1 ELSE 0 END) OVER (PARTITION BY SomeID) as cnt
from @t t
unpivot (MoneyValue for MoneyType in (Cash,Credit,Debit,Account,Other)) x
), Repiv as (
select *
from Unpiv u
pivot (SUM(MoneyValue) for MoneyType in (Cash,Credit,Debit,Account,Other)) x
where
cnt >= 2
)
select * from Repiv
这确实假设您有另一列(这里称为SomeID
),通过该列可以唯一地标识每一行
结果:
SomeID cnt Cash Credit Debit Account Other
----------- ----------- --------------------- --------------------- --------------------- --------------------- ---------------------
3 2 2.00 1.00 0.00 0.00 0.00
只是希望上面的内容能够更适合某些需求变体。那么您的要求是什么?您尝试过什么?任何值都可以小于0吗?4选择2种组合。如果您尝试返回至少有两个非零列的行,您可以使用WHERE
子句来完成,但容纳列值的所有变化可能有点长。@jarlh您的意思是更大?喜欢这个解决方案,简洁优雅+1当使用sql server 2012或更高版本时,这比以下情况短:IIF([现金]>0,1,0)+IIF([信用卡]>0,1,0)…是必须相同,因为sql server在以下情况下内部将IIF转换为case:)
SELECT
[CASH], [CREDIT CARD], [DEBIT CARD], [ACCOUNT], [OTHER]
FROM table
WHERE (
SELECT COUNT(*)
FROM (VALUES ([CASH]),([CREDIT CARD]),([DEBIT CARD]),([ACCOUNT]),([OTHER])) t(value)
WHERE value > 0
) >= 2