Как показать сумму общих результатов и результат каждого из выходных sql

#sql #oracle #oracle12c #sqlplus #ora-00937

#sql #Oracle #oracle12c #sqlplus #ora-00937

Вопрос:

Я пытаюсь отобразить общую сумму общей выходной стоимости счета-фактуры: это таблицы с выделенными курсивом столбцами, представляющими первичные ключи: Customer:

 | name | *cust#* |
| -------- | -------------- |
| Radio Spares   |     c1       |
| Pyramid| c2            |
 

Элемент:

 | *item#* | iname | price      |      
| -------- | -------------- | ----------
| i1    | CD          |  1        |
| i2   | DVD          | 2 |
 

StandingOrder:

 | *so#* | cust# | item#      |      
| -------- | -------------- | ----------
| so1    | c1          |  i1        |
| so2   | c2          | i2 |
 

Счет-фактура:

 | *in#* | cust# |
| -------- | -------------- |
| i1    | c1       |
| i2   | c2         |
 

Доставка:

 | *d#* | in#      |      
| -------- | -------------- |
| d1    |   1        |
| d2   | 2 |
| d3    |   1        |
| d4   | 2 |
| d5    |   1        |
| d6   | 2 |
 

Dquantity:

 | so# | d#      | quantity |    
| -------- | -------------- | -----|
| d1    |   1        | 1|
| d2   | 2 | 2|
| d3    |   1        | 1|
| d4   | 2 | 2|
| d5    |   1        | 1|
| d6   | 2 | 2|
 

Я хочу найти: сумму общей стоимости после запрошенного вывода:

 distinct cu.name as customer_name,
dq.d# as delivery_no,
item.item# as item_no,
item.iname as description,
dq.quantity as quantity,
item.price as item_price,
item.price*dq.quantity as cost,
sum(item.price*dq.quantity) as sum
from customer cu
inner join standingorder sor on cu.cust#=sor.cust#
inner join dquantity dq on sor.order#=dq.order#
inner join invoice iv on cu.cust#=iv.cust#
inner join delivery dl on iv.inv#=dl.inv#
inner join item on sor.item#=item.item#
where cu.cust# = 'c2';
 

но когда я это делаю, мне выдается ORA-00937: не одногруппная групповая функция. но если я удалю

 sum(item.price*dq.quantity) as sum
 

Он выполняется, но без общей суммы, которая мне нужна.
Итак, в этом случае: где cu.cust # = ‘c1’ сумма будет равна 3, а ‘c2’ сумма равна 12.

Что я хотел бы видеть: для c2:

 CUSTOMER_NAME            DELIVE ITEM_N IName            QUANTITY
------------------------ ------ ------ -------------------- ----------
ITEM_PRICE       COST 
---------- ----------
Pyramid             D2    I2     DVD                         2
      2      4

                    D4     I2     DVD                        2
      2      4

                    D6    I2     DVD                         2
      2      4

Sum
---
12
 

Комментарии:

1. Вам нужно предложение GROUP BY.

2. Было бы полезно показать результаты, которые вы хотели бы видеть. Я не уверен, что вы хотите сделать со sum значением.

Ответ №1:

Все столбцы, которые не агрегируются, должны содержаться в GROUP BY предложении. Например (простой):

Это то, что у вас есть сейчас:

 SQL> select deptno, job, sum(sal)
  2  from emp
  3  /
select deptno, job, sum(sal)
       *
ERROR at line 1:
ORA-00937: not a single-group group function
 

Добавьте GROUP BY предложение:

 SQL> select deptno, job, sum(sal)
  2  from emp
  3  group by deptno ,job;

    DEPTNO JOB         SUM(SAL)
---------- --------- ----------
        20 CLERK            920
        30 SALESMAN        5600
        20 MANAGER         2975
        30 CLERK            950
        10 PRESIDENT      10000
        30 MANAGER         2850
        20 PRESIDENT       1100
        10 CLERK           1300
        10 MANAGER         2450
        20 ANALYST         6000

10 rows selected.
 

В качестве альтернативы, посмотрите, делает ли sum — в своей аналитической форме — то, что вы хотите:

 SQL> select deptno, job,
  2    sum(sal) over (partition by deptno order by null) sumsal
  3  from emp;

    DEPTNO JOB           SUMSAL
---------- --------- ----------
        10 MANAGER        13750
        10 PRESIDENT      13750
        10 CLERK          13750
        20 MANAGER        10995
        20 ANALYST        10995
        20 PRESIDENT      10995
        20 CLERK          10995
        20 ANALYST        10995
        30 SALESMAN        9400
        30 SALESMAN        9400
        30 SALESMAN        9400
        30 CLERK           9400
        30 MANAGER         9400
        30 SALESMAN        9400

14 rows selected.

SQL>
 

Ответ №2:

Похоже, вам нужен group by :

 select cu.name as customer_name, dq.d# as delivery_no,
       sum(item.price*dq.quantity) as sum
from . . .
where cu.cust# = 'c2'
group by cu.name, dq.d#;
 

Это возвращает общее количество за доставку. Он удаляет всю информацию, относящуюся к конкретному элементу, потому что это, вероятно, вернет слишком много строк.

Если вам нужно общее количество для каждого клиента, также удалите доставку:

 select cu.name as customer_name
       sum(item.price*dq.quantity) as sum
from . . .
where cu.cust# = 'c2'
group by cu.name;
 

Редактировать:

Если вы просто хотите, чтобы общее количество было одинаковым для всех строк, тогда используйте оконные / аналитические функции:

 select . . . , -- all the columns you want
       sum(item.price * dq.quantity) over (partition by cu.cust#) as customer_total
from . . .
 

Комментарии:

1. То, что я пытаюсь сделать, это показать общую сумму результатов, которая отсутствует в выходных данных, выполнив то, что вы дали, просто выдайте мне ошибку ORA-00979, А НЕ ГРУППУ ПО ВЫРАЖЕНИЮ. можете ли вы уточнить дальше?

2. Я попробовал ваш код в edit, но customer_total дает не 12 для cust#=’c2′, не могли бы вы уточнить это?

3. @JoeLiu . , , Ваш код, вероятно, генерирует дубликаты, предположительно из-за нескольких поставок для заказа.

4. это именно то, что я хочу, но я хочу, чтобы сумма суммы была суммой затрат