问题
我对 PL/SQL 有疑问,因为我是 PL/SQL 世界的新手。 假设我有这样的桌子。
COlumnA COlumnB COlumnC
1 5000000000 X
1 5000000000 X
2 4350000000 X
2 4350000000 X
3 10000000000 X
3 10000000000 X
3 10000000000 X
4 1809469720 Y
5 10000000000 X
5 10000000000 X
6 3000000000 X
6 3000000000 X
我想产生如下的选择语句。
ColumnC |Sum
X |32350000000
Y |1809469720
我已经在 Oracle 12c 中通过内部查询解决了这个问题,但是当系统需要转到 Oracle 11g 时,我的查询不再起作用,我只需要一个 select 语句就可以得到预期的结果。
有人可以建议吗?
谢谢!
回答1
这就是我想出的……在 SELECT 列表中使用内联视图而不是相关子查询。
SELECT d.columnc AS "ColumnC"
, SUM(d.columnb) AS "Sum"
FROM ( SELECT t.columna
, t.columnb
, t.columnc
FROM tablea t
GROUP
BY t.columna
, t.columnb
, t.columnc
) d
GROUP
BY d.columnc
这使用内联视图(别名为“d”)从 tablea 返回一组“不同”的行。 我们可以使用 GROUP BY 子句或包含 DISTINCT 关键字,甚至通过编写使用 UNION 集合运算符的查询来获得不同的集合。
只需将该查询包装在括号中,分配一个别名,然后在 FROM 子句中使用它,就好像它是一个表或视图一样。
该语句的操作类似于在 FROM 子句中引用 VIEW。
您不需要这样做,只是为了说明上面的查询是如何操作的。 我们可以创建一个视图,如下所示:
CREATE VIEW d AS
SELECT t.columna
, t.columnb
, t.columnc
FROM tablea t
GROUP
BY t.columna
, t.columnb
, t.columnc
然后我们可以引用另一个查询的 FROM 子句中的视图,例如
SELECT d.columnc AS "ColumnC"
, SUM(d.columnb) AS "Sum"
FROM d
GROUP
BY d.columnc
但我们实际上并不需要创建 VIEW 对象。 我们可以将视图查询包含为“内联视图”。
我不相信 Oracle 11g 将内联视图的嵌套限制为三个级别。 我怀疑您遇到的限制与相关子查询有关。 子查询可以引用外部查询中的列,但只能引用它所使用的查询中的列。它不能引用更远的查询中的列。 (我还没有通过测试确认,但这是我的回忆。)
这是来自 Oracle 的实际 ORA- 和/或 PLS- 错误消息将有助于识别您遇到的限制。
回答2
首先找到COlumnA
、 COlumnB
和COlumnC
的distinct
值,然后进行聚合
试试这个
select COlumnC,sum(COlumnB) from
(
select distinct COlumnA,COlumnB,COlumnC
from Table1
)
Group by COlumnC
回答3
或者您可以简单地使用此查询。
Select sum(columnB) as sum,columnC from table_name group by ColumnC;
更多相关内容:请点击查看