如何在oracle中操作SQL ROWNUM



如何操作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相当大或是一个复杂的查询,否则您可能不会注意到差异。

最新更新