#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. это именно то, что я хочу, но я хочу, чтобы сумма суммы была суммой затрат