【问题标题】:How to count specific values in a table如何计算表中的特定值
【发布时间】:2010-10-12 08:46:44
【问题描述】:

我有一列有 15 个不同的值。我想数一数其中有多少, 我想出了例如

select a,COUNT(IFNULL(b != 1,NULL)),COUNT(IFNULL(b != 2,NULL)) from 
  mytable group by a

select a,SUM(CASE WHEN a = 1 THEN 1 ELSE 0)),SUM(CASE WHEN a = 2 THEN 1 ELSE 0))  from 
  mytable group by a

这样做的最佳方法是什么? (注意,我需要将这些值转换为列, 一个简单的 select a,b,count(*) from mytable where b=1 or b=2 group by a,b;不会的。)

【问题讨论】:

  • 如果您需要将它们放在单独的列中,您的查询似乎会尽可能有效。
  • IFNULL(expr, NULL) 毫无意义。它总是等价于expr
  • 同样CASE WHEN a = 1 THEN 1 ELSE 0 等价于a = 1
  • @Anonym,SUM(CASE... 构造应该只需要一个 )
  • @Mark Ba​​nnister, NULLIF(b!=1,NULL) 没有意义

标签: sql mysql


【解决方案1】:

在问题中建议的两种方法中,我推荐第二种:

select a,
       SUM(CASE WHEN b = 1 THEN 1 ELSE 0) b1,
       SUM(CASE WHEN b = 2 THEN 1 ELSE 0) b2
from mytable 
group by a

- 因为它既简单又(我认为)更容易理解,因此也更容易维护。我建议包含列别名,因为它们使输出更容易理解。

【讨论】:

    【解决方案2】:

    首先你误解了IFNULL 函数(你可能想要IF)。请参阅文档http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

    您在问题中的第二个查询将为您提供所需的内容。但是SUM(a=x) 绰绰有余。在 MySQL 中,true 等于 1false 等于 0

    【讨论】:

      【解决方案3】:

      你尝试过交叉连接吗?

      select *
        from (
              select a, sum(...) as aSum 
                from mytable 
               where a... 
               group 
                   by a
             ) as forA
             cross join (
                         select b, sum(...) as bsum 
                           from (
                                 select * 
                                   from mytable 
                                  where b... 
                                  group 
                                     by b
                                )
                        ) as forB;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-09-11
        • 1970-01-01
        • 1970-01-01
        • 2019-11-26
        • 2019-10-03
        • 2021-07-16
        • 1970-01-01
        相关资源
        最近更新 更多