Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查看表中的两列或多列是否大于0_Sql_Sql Server_Select - Fatal编程技术网

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