sql - 如何显示总结果的总和以及每个输出sql的结果
问题描述
我正在尝试显示发票总输出成本的总和:这些是带有表示主键的斜体列的表:客户:
| name | *cust#* |
| -------- | -------------- |
| Radio Spares | c1 |
| Pyramid| c2 |
物品:
| *item#* | iname | price |
| -------- | -------------- | ----------
| i1 | CD | 1 |
| i2 | DVD | 2 |
长期订单:
| *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 |
数量:
| 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: not a single-group group function。但如果我删除
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
解决方案
所有未聚合的列都必须包含在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>
推荐阅读
- javascript - 使用符号链接在多个 React 应用程序之间共享代码
- mysql - mySQL 在一个表上失去连接,在任何其他表上都没有
- python - Scrapy css 选择器返回一个空的价目表
- sql - 如何在 SQL 案例研究中按每个级别级别聚合?
- wordpress - 在 Woocommerce 中更改运费
- python - 如何在 Python 代码中使用来自 PyCharm DB 控制台的 SQL?
- erd - ERD图关系
- r - 有没有一种简单的方法来翻转矩阵(水平或垂直)?
- ios - (Swift) API 调用第一次没有通过,第二次尝试调用第一次点击
- html - 阿拉伯语文本阴影问题