使用SQL查询获得总折扣

时间:2019-06-25 05:37:10

标签: sql oracle

我有一个查询,可以计算每个商品的折扣。现在我要的是获得折扣的总额。我该怎么办?

我要计算折扣的查询是:

select (dla.unit_list_price + dla.unit_selling_price) * dla.ordered_qty as discount
       , dla.itemname as item_name 
 from doo_lines_all dla

例如,以下是我执行的查询的返回数据。

Item_Name        Discount
Item1            50
Item2            25
Item3            30

现在我要获得的总折扣是我预期的结果是105

5 个答案:

答案 0 :(得分:1)

here查询:

select sum((dla.unit_list_price + dla.unit_selling_price) * dla.ordered_qty) as discount
       , dla.itemname as item_name 
 from doo_lines_all dla
  

SUM返回expr的值之和。

答案 1 :(得分:1)

尝试使用“ SUM”功能 像这样

SUM((dla.unit_list_price + dla.unit_selling_price) * dla.ordered_qty) as discount

答案 2 :(得分:1)

您将不得不放弃商品名称:

select sum((dla.unit_list_price + dla.unit_selling_price) * dla.ordered_qty) as totaldiscount
from doo_lines_all dla

这将仅产生“ 105”的单个输出(一行,一列)

如果您想在其中保留商品名称,并在行中显示单个折扣和重复总额,我们可以使用分析:

select 
  dla.itemname,
  (dla.unit_list_price + dla.unit_selling_price) * dla.ordered_qty as discount,
  sum((dla.unit_list_price + dla.unit_selling_price) * dla.ordered_qty) over() as totaldiscount

from doo_lines_all dla

这将产生如下输出:

Item_Name        Discount  TotalDiscount
Item1            50        105
Item2            25        105
Item3            30        105

还有其他方法可以实现相同的目的,但是解析功能也许是最简单的编写方式,尽管也许比这样做更难理解:

select 
  dla.itemname,
  (dla.unit_list_price + dla.unit_selling_price) * dla.ordered_qty as discount,
  t.totaldiscount

from doo_lines_all dla
cross join
(
  select sum((unit_list_price + unit_selling_price) * ordered_qty) as totaldiscount
  from doo_lines_all
) t

这计算出子查询中的总数,然后通过交叉联接将其从dla连接到每一行。您可能会认为它与分析工作相同/这是思考分析工作方式的一种方法

答案 3 :(得分:0)

您可以使用SUM分析功能

with tab as(
  select 'item1' as item , 50 as discount from dual union all
  select 'item2' as item , 25 as discount from dual union all
  select 'item3' as item , 30 as discount from dual 
)
select t.*
     , sum(t.discount) OVER () AS total_discount
from tab t;
ITEM  | DISCOUNT | TOTAL_DISCOUNT
:---- | -------: | -------------:
item1 |       50 |            105
item2 |       25 |            105
item3 |       30 |            105

db <>提琴here

答案 4 :(得分:0)

您可以使用grouping sets

with doo_lines_all( discount, item_name ) as
(
 select 50, 'Item1' from dual union all
 select 25, 'Item2' from dual union all
 select 30, 'Item3' from dual
)
select item_name, 
       sum( discount ) as discount 
  from doo_lines_all dla
 group by grouping sets(item_name,())
 order by item_name;

ITEM_NAME   DISCOUNT
---------   --------
Item1       50
Item2       25
Item3       30
            105

将折扣总和作为单独的一行返回。