MySQL-查询-多分组依据

MySQL-查询-多分组依据,sql,mysql,group-by,aggregate-functions,Sql,Mysql,Group By,Aggregate Functions,我有一个下表,在这个表中,我试图对type='printer'求和,但是,我不想计算重复的客户端ID。所以我期待着这样的事情: +------+-----------+-----------+ | k_id | client_id | type | +------+-----------+-----------+ | 1 | 100 | pc | | 2 | 101 | printer | | 3 | 101

我有一个下表,在这个表中,我试图对type='printer'求和,但是,我不想计算重复的客户端ID。所以我期待着这样的事情:

+------+-----------+-----------+
| k_id | client_id | type      |
+------+-----------+-----------+
|    1 |       100 | pc        | 
|    2 |       101 | printer   | 
|    3 |       101 | printer   | 
|    4 |       101 | printer   | 
|    5 |       102 | cellphone | 
+------+-----------+-----------+
查询:

  SELECT client_id, 
         SUM(IF(type = 'printer', 1,0)) 
    FROM FOO 
GROUP BY type, client_id;
结果:

+-----------+--------------------------------+
| client_id | SUM(IF(type = 'printer', 1,0)) |
+-----------+--------------------------------+
|       102 |                              0 | 
|       100 |                              0 | 
|       101 |                              3 | 
+-----------+--------------------------------+
预期结果:

+-----------+--------------------------------+
| client_id | SUM(IF(type = 'printer', 1,0)) |
+-----------+--------------------------------+
|       102 |                              0 | 
|       100 |                              0 | 
|       101 |                              1 | 
+-----------+--------------------------------+

打印机类型为
时有三行
Sum
将它们全部相加,并返回3

如果您想查看带有打印机的行的
1
,或者
0
,请尝试
max
而不是
sum

MAX(IF(type = 'printer', 1,0))
^^^
编辑:要计算不同打印机的数量,可以使用子查询:

SELECT  client_id
,       (
        select  count(*) 
        from    FOO as f2 
        where   f1.client_id = f2.client_id
                and type = 'Printer'
        )
FROM    FOO as f1
GROUP BY 
        client_id
(我猜:我不熟悉IF(…)

使用:

   SELECT x.client_id,
          COUNT(DISTINCT y.type) 
     FROM FOO x
LEFT JOIN FOO y ON y.client_id = x.client_id
               AND y.type = 'printer'
 GROUP BY x.client
如果不需要查看计数为零的行:

   SELECT client_id, 
          COUNT(DISTINCT type)
     FROM FOO 
    WHERE type = 'printer'
 GROUP BY type, client_id;
选择客户端id,如果(`type`='printer',1,0)
来自富
按类型分组,客户端id

在mysql中,您不需要max,只需省略function@Josh:您可以使用子查询(添加到答案)@Imre L:Without
max()
,它将仅对随机行运行
if
,而不是所有if
   SELECT client_id, 
          COUNT(DISTINCT type)
     FROM FOO 
    WHERE type = 'printer'
 GROUP BY type, client_id;