多列条件计数 SQL

Posted

技术标签:

【中文标题】多列条件计数 SQL【英文标题】:Multiple Column Conditional Count SQL 【发布时间】:2012-05-15 14:57:15 【问题描述】:

我正在尝试连续计算 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

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

也许我遗漏了一些东西,但这会很简单:

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 中也可以使用相同的语法)

【讨论】:

【参考方案2】:

对于您的示例 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

【讨论】:

谢谢,这正是我想要的! 您的第二个示例使用 Case,它在 MS Access 中不可用(请参阅标签) @Remou:好点子,我认为在这种情况下我们可以使用IIF 其他表的想法非常好..但是您忘记将所有这些联合表输出放入一个组合查询中并选择不同的值.. 为 MS Access 更新了 IIF 的第二个示例。还更新了第一个示例以从表中正确选择 MS Access。在 MS Access 2012 中,这两个查询都经过测试并且对我来说运行良好。

以上是关于多列条件计数 SQL的主要内容,如果未能解决你的问题,请参考以下文章

SQL 内连接 2 个具有多列条件的表并更新

pyspark中基于条件对多列进行分组的累积和函数

PostgreSQL 统计同一张表的多列

使用案例条件将多列转换为行

基于连续条件的 SQL 查询计数

根据 SQL Server 中的条件计数