所有的SUM都会产生一个巨大的SELECT,包括WHERE

时间:2017-01-16 11:08:43

标签: sql oracle group-by sum

我有一个巨大的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  |
|________________________________|______+

哪一个效率最高?

5 个答案:

答案 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分组

参考:https://www.techonthenet.com/sql/sum.php

答案 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