如何使用查询在不同的列中查找相同值的出现

时间:2018-07-11 10:15:30

标签: sql sql-server tsql sql-server-2008-r2

当我参加面试时,我遇到了一个有趣的问题,下面列出了 问题在下面给出

  

如何找出所有列中值1的出现

DECLARE @tbl AS TABLE(Col1 INT, Col2 INT, Col3 INT)
INSERT INTO @tbl
VALUES(1,1,1),(1,2,1),(1,1,3)

我已经分享了如下答案。不确定这是否是正确的答案。

SELECT (SELECT COUNT(1) FROM @tbl WHERE COL1 = 1) +
(SELECT COUNT(1) FROM @tbl WHERE COL2 = 1)+
(SELECT COUNT(1) FROM @tbl WHERE COL3 = 1)

请让我知道是否还有其他方法可以找到正确的答案

4 个答案:

答案 0 :(得分:7)

您可以使用apply

select cols, count(*) as occurrence 
from @tbl cross apply 
     ( values ('col1', col1), ('col2', col2), ('col3', col3)
     ) t (cols, val)
where val = 1
group by cols;

答案 1 :(得分:1)

我脑海中只有一个答案:)不知道它是正确的。

DECLARE @tbl AS TABLE(Col1 INT, Col2 INT, Col3 INT)
INSERT INTO @tbl
VALUES(1,1,1),(1,2,1),(1,1,3)
SELECT SUM(CASE WHEN Col1 =1 THEN 1 ELSE 0 END)+SUM(CASE WHEN Col2 =1 THEN 1 ELSE 0 END)+SUM(CASE WHEN Col3 =1 THEN 1 ELSE 0 END) FROM @tbl WHERE (Col1 = 1 OR Col2 =1 OR COl3=1)

答案 2 :(得分:1)

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.26.0/polyfill.min.js"></script>

答案 3 :(得分:1)

另一种方法使用XML和XQuery的强大功能来处理通用数据。当您将值传递为sql:column()sql:variable而不是硬编码的“ 1”时,它将是完全通用的。这种方法甚至不需要事先知道列的数量和名称:

DECLARE @tbl AS TABLE(Col1 INT, Col2 INT, Col3 INT);
INSERT INTO @tbl
VALUES(1,1,1),(1,2,1),(1,1,3);    

-查找所有值均为1的行

SELECT 
(
    SELECT * FROM @tbl FOR XML PATH('row'),ROOT('tbl'),TYPE
)
.query('/tbl/row[not(*/text()!="1")]');

-计算1s

SELECT *
      ,x.value('count(/row/*[text()="1"])','int')
FROM @tbl t
CROSS APPLY(SELECT t.* FOR XML PATH('row'),TYPE) AS A(x)