我想知道如何写这个查询。

我知道这个实际的语法是虚假的,但它将帮助您理解我想要的东西。

我需要这种格式,因为它是一个更大查询的一部分。

SELECT distributor_id,
COUNT(*) AS TOTAL,
COUNT(*) WHERE level = 'exec',
COUNT(*) WHERE level = 'personal'

我需要在一个查询中返回这一切。

此外,它需要在一行中,所以下面的将不起作用:

'SELECT distributor_id, COUNT(*)
GROUP BY distributor_id'

当前回答

SELECT 
    distributor_id, 
    COUNT(*) AS TOTAL, 
    COUNT(IF(level='exec',1,null)),
    COUNT(IF(level='personal',1,null))
FROM sometable;

COUNT只计算非空值,DECODE只在满足条件时才返回非空值1。

其他回答

SELECT 
    distributor_id, 
    COUNT(*) AS TOTAL, 
    COUNT(IF(level='exec',1,null)),
    COUNT(IF(level='personal',1,null))
FROM sometable;

COUNT只计算非空值,DECODE只在满足条件时才返回非空值1。

如果您的SQL风格支持它,您可以使用COUNT_IF()基于条件进行计数。

SELECT
    distributor_id, 
    COUNT(*) AS total_count, 
    COUNT_IF(level = 'exec') AS exec_count, 
    COUNT_IF(level = 'personal') AS personal_count
FROM table_name
GROUP BY distributor_id

在Oracle中,你可以这样做

SELECT
    (SELECT COUNT(*) FROM schema.table1),
    (SELECT COUNT(*) FROM schema.table2),
    ...
    (SELECT COUNT(*) FROM schema.tableN)
FROM DUAL;

可以将CASE语句与聚合函数一起使用。这基本上和一些RDBMS中的PIVOT函数是一样的:

SELECT distributor_id,
    count(*) AS total,
    sum(case when level = 'exec' then 1 else 0 end) AS ExecCount,
    sum(case when level = 'personal' then 1 else 0 end) AS PersonalCount
FROM yourtable
GROUP BY distributor_id

好吧,如果你必须在一个查询中所有这些,你可以做一个联合:

SELECT distributor_id, COUNT() FROM ... UNION
SELECT COUNT() AS EXEC_COUNT FROM ... WHERE level = 'exec' UNION
SELECT COUNT(*) AS PERSONAL_COUNT FROM ... WHERE level = 'personal';

或者,如果处理后可以做:

SELECT distributor_id, COUNT(*) FROM ... GROUP BY level;

您将得到每个级别的计数,并需要将它们全部加起来以得到总数。