Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.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 如何在多个列上使用count distinct?_Sql - Fatal编程技术网

Sql 如何在多个列上使用count distinct?

Sql 如何在多个列上使用count distinct?,sql,Sql,输入: 期望输出: id sem1 sem2 sem3 sem4 sem5 sem6 sem7 1 S O S R null null null 2 O O R R S null null 如果您的数据库支持APPLY/UNPIVOT运算符,则使用此 交叉应用方法 id O R S 1 1 1 2 2 2 2 1 SELECT id, SUM(CASE WHEN val = 'O' THEN

输入:

期望输出:

id sem1 sem2 sem3 sem4 sem5 sem6 sem7
1    S   O     S    R  null null null
2    O   O     R    R    S  null null

如果您的数据库支持
APPLY/UNPIVOT
运算符,则使用此

交叉应用
方法

id O   R   S
1  1   1   2
2  2   2   1
SELECT id, 
       SUM(CASE WHEN val = 'O' THEN 1 ELSE 0 END) O, 
       SUM(CASE WHEN val = 'R' THEN 1 ELSE 0 END) R, 
       SUM(CASE WHEN val = 'S' THEN 1 ELSE 0 END) S 
FROM   mytable 
       CROSS apply (VALUES (sem1), 
                           (sem2), 
                           (sem3), 
                           (sem4), 
                           (sem5), 
                           (sem6), 
                           (sem7)) cs(val) 
GROUP  BY id 
UNPIVOT
方法

id O   R   S
1  1   1   2
2  2   2   1
SELECT id, 
       SUM(CASE WHEN val = 'O' THEN 1 ELSE 0 END) O, 
       SUM(CASE WHEN val = 'R' THEN 1 ELSE 0 END) R, 
       SUM(CASE WHEN val = 'S' THEN 1 ELSE 0 END) S 
FROM   mytable 
       CROSS apply (VALUES (sem1), 
                           (sem2), 
                           (sem3), 
                           (sem4), 
                           (sem5), 
                           (sem6), 
                           (sem7)) cs(val) 
GROUP  BY id 

我个人更喜欢
CROSS-APPLY
方法,而不是
UNPIVOT
,因为它更具可读性。在性能方面,两者都是相同的

如果您的数据库支持
APPLY/UNPIVOT
运算符,则使用此

交叉应用
方法

id O   R   S
1  1   1   2
2  2   2   1
SELECT id, 
       SUM(CASE WHEN val = 'O' THEN 1 ELSE 0 END) O, 
       SUM(CASE WHEN val = 'R' THEN 1 ELSE 0 END) R, 
       SUM(CASE WHEN val = 'S' THEN 1 ELSE 0 END) S 
FROM   mytable 
       CROSS apply (VALUES (sem1), 
                           (sem2), 
                           (sem3), 
                           (sem4), 
                           (sem5), 
                           (sem6), 
                           (sem7)) cs(val) 
GROUP  BY id 
UNPIVOT
方法

id O   R   S
1  1   1   2
2  2   2   1
SELECT id, 
       SUM(CASE WHEN val = 'O' THEN 1 ELSE 0 END) O, 
       SUM(CASE WHEN val = 'R' THEN 1 ELSE 0 END) R, 
       SUM(CASE WHEN val = 'S' THEN 1 ELSE 0 END) S 
FROM   mytable 
       CROSS apply (VALUES (sem1), 
                           (sem2), 
                           (sem3), 
                           (sem4), 
                           (sem5), 
                           (sem6), 
                           (sem7)) cs(val) 
GROUP  BY id 

我个人更喜欢
CROSS-APPLY
方法,而不是
UNPIVOT
,因为它更具可读性。在性能方面,这两种方法都是相同的

您可以使用“case-when”条件,即您正在使用的
DBMS
您可以使用“case-when”条件,即您正在使用的
DBMS