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

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

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

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

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

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

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

当前回答

我认为这也适用于你选择count(*)作为anc,(从性别='F'的患者中选择count(*))作为patientF,(从性别='M'的患者中选择count(*)作为patientM从anc

你也可以选择和计数相关的表,像这样选择count(*)作为anc,(select count(*) from Patient where Patient. id =anc. patientid)作为patientF,(select count(*) from Patient where sex='M')作为patientM从anc

其他回答

我做了一些类似的事情,我只是给每个表一个字符串名称来在列a中标识它,并为列提供一个计数。然后我将它们合并,使它们堆叠。结果在我看来是漂亮的-不确定它与其他选项相比有多有效,但它给了我我需要的。

select 'table1', count (*) from table1
union select 'table2', count (*) from table2
union select 'table3', count (*) from table3
union select 'table4', count (*) from table4
union select 'table5', count (*) from table5
union select 'table6', count (*) from table6
union select 'table7', count (*) from table7;

结果:

-------------------
| String  | Count |
-------------------
| table1  | 123   |
| table2  | 234   |
| table3  | 345   |
| table4  | 456   |
| table5  | 567   |
-------------------

可以将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 a.distributor_id,
    (SELECT COUNT(*) FROM myTable WHERE level='personal' and distributor_id = a.distributor_id) as PersonalCount,
    (SELECT COUNT(*) FROM myTable WHERE level='exec' and distributor_id = a.distributor_id) as ExecCount,
    (SELECT COUNT(*) FROM myTable WHERE distributor_id = a.distributor_id) as TotalCount
FROM (SELECT DISTINCT distributor_id FROM myTable) a ;

编辑: 查看@KevinBalmforth对性能的分析,了解为什么你可能不想使用这种方法,而应该选择@Taryn♦的答案。我这样做是为了让人们明白他们的选择。

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

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;

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

在Oracle中,你可以这样做

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