【问题标题】:Count multiple columns with Group By and Union All?使用 Group By 和 Union All 计算多列?
【发布时间】:2019-06-24 10:31:24
【问题描述】:

我有一个查询,我想计算 3 列 s、s2 和 s3 的值并使用 Group By 列 s 的值?

到目前为止,我已经完成了这个db-fiddle

这会给我输出

1 - count 3  
2 - count 3  
4 - count 4

这几乎是正确的,但我还想包含正确的 Where 子句,因此计数只会是 where season = '2018/2019' 和 round = 34。

想要的输出必须是:

1 - count 3  
2 - count 2  
4 - count 2

知道如何编辑此查询以使 Where 子句在计数值中起作用吗?

问候,

阿里

【问题讨论】:

  • 如果赛季和回合中没有 s,你会放弃 s2 和 s3 - 我很好奇为什么?
  • 因为我只想对列 s 的值进行分组

标签: mysql group-by count


【解决方案1】:

您必须扩展联合查询以包括季节和回合,并在 where 子句中添加条件:

SELECT t.s, COUNT(*) as count FROM (
    SELECT s, season, round FROM tablename UNION all
    SELECT s2, season, round FROM tablename UNION all
    SELECT s3, season, round FROM tablename
) as t 
WHERE 
  t.s IN (
    SELECT s FROM tablename
    WHERE season = '2018/2019' 
      AND round = 34
      AND s is not null
  )
  AND t.season = '2018/2019' 
  AND t.round = 34
  AND t.s is not null
GROUP BY t.s
ORDER BY count DESC, t.s

请参阅demo
结果:

| s   | count |
| --- | ----- |
| 1   | 3     |
| 2   | 2     |
| 4   | 2     |

【讨论】:

    【解决方案2】:

    你应该过滤联合中每个表的行

    SELECT t.s, COUNT(*) as count FROM (
    SELECT s 
    FROM tablename 
    WHERE season = '2018/2019'  and round = 34
    UNION all
    SELECT s2 
    FROM tablename 
    WHERE season = '2018/2019' and round = 34
    UNION all
    SELECT s3 
    FROM tablename
    WHERE season = '2018/2019' and round = 34
    ) as t 
    GROUP BY t.s
    ORDER BY count DESC
    

    【讨论】:

    • 这很好用,唯一的问题是现在每个值都被计算在内,但我只希望 column s 做 Group By,在这个解决方案中,数字 3 也被计算在内。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-09
    • 1970-01-01
    相关资源
    最近更新 更多