多列条件计数SQL

3

我将尝试计算一行中4个不同列中的条目数量,然后汇总结果。

例如,表头看起来类似于:

ID       Col1    Col2    Col3    Col4

每一列(除了ID以外)都可以有文本值W、X、Y或Z。多个列可以有相同的值。
我想做的是找到一种方法,可以对每一列中的条目进行计数,但每行只计算W、X、Y和Z一次。所以如果:
ID       Col1    Col2    Col3    Col4
          X        X       Y
          Y        W       X
          Z        Y       Y

结果表格将如下所示:
    Value    Count
      W        1
      X        2
      Y        3
      Z        1

任何帮助都将不胜感激。
2个回答

3
也许我有所遗漏,但这是否就像这么简单:

Select Val, Count(*)
From    (
        Select Id, Col1 As Val From Table1
        Union Select Id, Col2 From Table1
        Union Select Id, Col3 From Table1
        Union Select Id, Col4 From Table1
        ) As Z
Where Z.Val Is Not Null
Group BY Z.Val

没有理由同时使用DistinctUnion,因为Union会使结果去重。因此,我们需要为每一行包含唯一的值(Id)。 SQL Fiddle(这里使用的是SQL Server,但同样的语法也适用于MS Access)。

3

以下这段代码可以解决您的4个示例问题:

select 'W' as [Value], count(*) as Count from Table1
    where Col1='W' or Col2='W' or Col3='W' or Col4='W' union
select 'X' as [Value], count(*) as Count from Table1
    where Col1='X' or Col2='X' or Col3='X' or Col4='X' union
select 'Y' as [Value], count(*) as Count from Table1
    where Col1='Y' or Col2='Y' or Col3='Y' or Col4='Y' union
select 'Z' as [Value], count(*) as Count from Table1
    where Col1='Z' or Col2='Z' or Col3='Z' or Col4='Z'

演示:http://www.sqlfiddle.com/#!3/68aa3/11
编辑: 如果存在大量可能的值,则可以通过联合所有可能的值并动态计数来进一步简化此过程:
select V.Value as [Value],
  count(IIF(col1=[Value] or col2=[Value]
            or col3=[Value] or col4=[Value],1,NULL)) as [Count]
from Table1, (
  select distinct col1 as [Value] from table1 union
  select distinct col2 from table1 union
  select distinct col3 from table1 union
  select distinct col4 from table1) V
where V.value is not null
group by V.value

2
你的第二个例子使用了Case语句,但在MS Access中不可用(请参见标签)。 - Fionnuala
@Remou:好观点,我认为在那种情况下我们可以使用IIF - mellamokb
那个关于另一个表的想法非常好,但是你忘记将所有这些联合表输出放入一个组合查询中,并选择不同的值。 - pratik garg
第二个示例已使用IIF进行了更新,适用于MS Access。同时,第一个示例已经更新为在MS Access中正确选择表格。这两个查询在我测试后在MS Access 2012中运行良好。 - mellamokb
哦,我的错误...我跳过了group by子句...(+1) - pratik garg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接