如何操作SQL ROWNUM?
编写以下代码是为了计算EMPLOYEES表中带和不带COMMISSION _PCT为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
在这种情况下如果执行SELECT COUNT(*(,则结果为单行中的8。我想要什么
72, 1
35, SUM (rows 2-8)
同上。
我想知道怎样才能达到我想要的结果。
向致以最诚挚的问候
将非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,当佣金百分比为零时,表达式为null。因此只有两组,一组用于等于0的case
表达式,另一组用于它为null。
目前还不清楚你为什么认为这与";操纵CCD_ 5"-我不明白你为什么在任何地方都需要它。
使用聚合:
SELECT COUNT(COMMISSION_PCT) as num_with_commission,
COUNT(*) - COUNT(COMMISSION_PCT) as num_without_commission
FROM EMPLOYEES;
这恰好起作用,因为您说缺少的值是NULL
。如果是其他内容,则可以将CASE
表达式与SUM()
一起使用:
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
相当大或是一个复杂的查询,否则您可能不会注意到差异。