如何操作SQL ROWNUM?
下面的代码用于统计EMPLOYEES表中COMMISSION_PCT为NULL和不为NULL的列数。
SELECT *
FROM (SELECT T.*, ROWNUM AS RN
FROM (
SELECT COUNT(*)
FROM EMPLOYEES
GROUP BY COMMISSION_PCT) T
) T2结果是这样的:
COUNT(*), RN
72,1
5,2
3,3
1,4
7,5
7,6
6,7
6,8在这种情况下,如果选择COUNT(*),则结果为一行中的8个。我想要的
72, 1
35, SUM (rows 2-8)同上。
我想知道怎样才能达到我想要的结果。
最好的尊重
发布于 2021-05-22 19:13:57
使用聚合:
SELECT COUNT(COMMISSION_PCT) as num_with_commission,
COUNT(*) - COUNT(COMMISSION_PCT) as num_without_commission
FROM EMPLOYEES;这恰好可以工作,因为您说缺少的值是NULL。如果是其他内容,则可以使用带有SUM()的CASE表达式:
SELECT SUM(CASE WHEN COMMISSION_PCT <> 0 THEN 1 ELSE 0 END) as num_with_commission,
SUM(CASE WHEN COMMISSION_PCT <> 0 THEN 0 ELSE 1 END) as num_without_commission
FROM EMPLOYEES;编辑:
如果你想要两行的结果,你可以取消上面的透视。或者只使用两个查询:
SELECT 'With Commission', COUNT(*)
FROM EMPLOYEES
WHERE COMMISSION_PCT IS NOT NULL
UNION ALL
SELECT 'Without Commission', COUNT(*)
FROM EMPLOYEES
WHERE COMMISSION_PCT IS NULL;这比取消透视的效率要低一些,但是除非EMPLOYEES非常大或者是一个复杂的查询,否则您可能不会注意到其中的区别。
发布于 2021-05-22 22:26:57
分离非null和null佣金百分比,然后对结果进行分组。您可以直接在GROUP BY子句中使用case表达式(或许多其他方式)来完成此操作。如下所示:
SELECT *
FROM (SELECT T.*, ROWNUM AS RN
FROM (
SELECT COUNT(*)
FROM hr.EMPLOYEES
GROUP BY case when COMMISSION_PCT is not null then 0 end) T
) T2;当佣金百分比不为空时,GROUP BY中的表达式为0;当佣金百分比为空时,表达式为空。因此只有两个组,一个组用于case表达式等于0,另一个组用于该表达式为空。
不清楚为什么你会认为这与“操纵ROWNUM”有关--我不明白你为什么需要它。
https://stackoverflow.com/questions/67648831
复制相似问题