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

How find the occurrences of same value in different columns using a query

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

How to find out the occurrence of the value 1 in all the columns

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)

请告诉我是否有其他方法可以找到正确答案

刚想出来分享一个答案:)不知道正确到什么程度。

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)

您可以使用 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;
SELECt a.*, b.x  FROM @tbl a
OUTER APPLY
(   
    SELECT TOP 1 1
    FROM (VALUES(a.Col1),(a.Col2),(a.Col3)) c(a)
    WHERE   
        c.a = 1
) b(x)

另一种方法使用 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")]');

--数1

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