我有一个巨大的SELECT,包括子选择和很多东西...像:
SELECT a AS A,
b AS B,
c AS C,
d AS D,
(SELECT x FROM y WHERE z) AS E,
(SELECT x2 FROM y2 WHERE z2) AS F,
[...]
price
FROM table
INNER lot_of_tables
WHERE lot_of_filters = lot_of_conditions
有没有办法修改此请求以获取所选价格的总金额(包括WHERE子句)而不使用GROUP BY
?
因为使用Oracle,如果我使用SUM(price)
我必须添加GROUP BY
表达式...而我只是无法“重现”SELECT ...而整体Oracle不接受别名在GROUP BY子句中(...为什么?)
更新:
有些人说我不够清楚......我完全同意^^ 我现在有这样的结果:
+----+---+---+---+---+---+-------+
| A | B | C | D | E | F | price |
+--------------------------------+
| --- Datas got with filter ---- |
| ------------------------------ |
|________________________________|
我希望这些数据的价格与实际列相同!喜欢:
+----+---+---+---+---+---+-------+------+
| A | B | C | D | E | F | price | SUM()|
+--------------------------------+------+
| --- Datas got with filter ---- |14875 |
| ------------------------------ |14875 |
|________________________________|______+
OR
+----+---+---+---+---+---+-------+------+
| A | B | C | D | E | F | price | SUM()|
+--------------------------------+------+
| --- Datas got with filter ---- | NULL |
| ------------------------------ | NULL |
| N | N | N | N | N | N | NULL | SUM |
|________________________________|______+
哪一个效率最高?
答案 0 :(得分:2)
假设您有以下查询:
select 'a' as A,
(select 1 from dual) as one,
two,
price
from dual
cross join ( select 2 as two from dual union all select 2 from dual)
cross join ( select 100 as price from dual)
给出:
a 1 2 100
a 1 2 100
如果我理解得很好,你可能需要:
select 'a' as A,
(select 1 from dual) as one,
two,
price,
sum(price) over () as sum_price
from dual
cross join ( select 2 as two from dual union all select 2 from dual)
cross join ( select 100 as price from dual)
给出:
a 1 2 100 200
a 1 2 100 200
答案 1 :(得分:0)
您可以使用CROSS JOIN
:
SELECT a,
b,
c,
d,
(SELECT x FROM y WHERE z),
(SELECT x2 FROM y2 WHERE z2),
[...]
price,
t.sum_of_prices
FROM table
CROSS JOIN (
SELECT SUM(price) AS sum_of_prices
FROM table
WHERE lot_of_filters = lot_of_conditions) t
WHERE lot_of_filters = lot_of_conditions
答案 2 :(得分:0)
汇总函数时无法避免GROUP BY
,例如SUM
并希望包含非聚合列值。
将复杂的SELECT
查询包装到CTE表达式中,如下所示:
;
WITH my_query AS (
SELECT a,
b,
c,
d,
(SELECT x FROM y WHERE z) AS x,
(SELECT x2 FROM y2 WHERE z2) AS x2,
[...]
price
FROM table
INNER lot_of_tables
WHERE lot_of_filters = lot_of_conditions
)
SELECT SUM(price)
FROM my_query
答案 3 :(得分:0)
select userid,a,b,c,(select abc from z),(select xyz from z), price, sum(price)
from table1 inner join table2 on table1.a=table2.a
等等 其中filter1和filter2等等
并且您想要购买的每个用户ID的总和(价格)
如果您要问的是上述问题,那么答案是肯定的,您需要对它们进行分组。
select userid,a,b,c,
select abc from z),(select xyz from z),
price, sum(price)
from table1 inner join table2 on table1.a=table2.a
等等 其中filter1和filter2等 按用户ID分组
答案 4 :(得分:0)
您可以使用sum()over(),如下所示:
SELECT a AS A,
b AS B,
c AS C,
d AS D,
(SELECT x FROM y WHERE z) AS E,
(SELECT x2 FROM y2 WHERE z2) AS F,
[...]
price,
Sum(price) over () as sum_price
FROM table
INNER lot_of_tables
WHERE lot_of_filters = lot_of_conditions