当值与其他GROUP BY子句不同时,Oracle SQL选择SUM
我有以下示例_数据集:当值与其他GROUP BY子句不同时,Oracle SQL选择SUM,sql,select,group-by,sum,oracle12c,Sql,Select,Group By,Sum,Oracle12c,我有以下示例_数据集: ORD | POS | INSGRP | INS | DELI | DELPOS ------------------------------------------------------- 1 | 'Pos11' | '11' | 11 | 'deli111' | 'DelPos1111' 1 | 'Pos11' | '11' | 11 | 'deli112' | 'DelPos1121' 1 | 'Pos11' | '1
ORD | POS | INSGRP | INS | DELI | DELPOS
-------------------------------------------------------
1 | 'Pos11' | '11' | 11 | 'deli111' | 'DelPos1111'
1 | 'Pos11' | '11' | 11 | 'deli112' | 'DelPos1121'
1 | 'Pos11' | '11' | 11 | 'deli112' | 'DelPos1122'
2 | 'Pos21' | '21' | 21 | 'deli211' | 'DelPos2111'
2 | 'Pos21' | '22' | 22 | 'deli221' | 'DelPos2211'
2 | 'Pos21' | '22' | 22 | 'deli221' | 'DelPos2212'
3 | 'Pos31' | '31' | 31 | 'deli311' | 'DelPos3111'
3 | 'Pos32' | '31' | 31 | 'deli321' | 'DelPos3211'
3 | 'Pos32' | '31' | 31 | 'deli321' | 'DelPos3212'
3 | 'Pos32' | '31' | 31 | 'deli322' | 'DelPos3221'
- 当ORD有多个POS时,只有一个INSGRP
- 当ORD只有一个POS时,可以有多个INSGRP
- 这是我实际请求的一个简单版本,只暴露了这个问题
- 一个餐厅可以有很多熟食店
- 一个熟食店可以有很多熟食店
- DELI和DELPOS用于添加重复ORD-POS-INSGRP-INS的行
- 当POS只有一个INSGRP时,我希望INS保持不变
- 当一个POS有多个INSGRP时,我需要该POS的不同INSGRP的INS之和
ORD | SUM(INS)
-----------------------------------------------------------------------
1 | 11
One INSGRP for one POS, so INS stay the same 11
2 | 43
Two INSGRP for one POS, so INS is the SUM of the INSGRP 21 and 22 so 43
3 | 31
One INSGRP for two POS, so INS stay the same 31
我尝试了以下方法:
SELECT ord,
SUM (ins) AS ins
FROM sample_data
GROUP BY ord, pos
ORDER BY ord;
得到了这个结果:
ORD | INS
---------
1 | 33
2 | 65
3 | 31
3 | 93
所有的东西都是总和,ORD 3的每个INSGRP都有一行。然后我将INS添加到GROUPBY子句中,但它只在两行上分隔ORD 2
我尝试将所有内容分组,并在开头添加一个独特的:
SELECT UNIQUE ord,
SUM (ins) AS ins
FROM sample_data
GROUP BY ord, pos, deli, DelPos
ORDER BY ord;
结果是:
ORD | INS
---------
1 | 11
2 | 21
2 | 22
3 | 31
这是我得到的最接近我想要的结果。唯一缺少的部分是将ORD 2分组在一行上,并对INS求和
另外,我希望能够像这样对组进行分区:
SUM (ins) OVER (PARTITION BY ord, pos, deli, DelPos) AS ins
有人能帮我吗
以下是样本数据的请求:
WITH sample_data
AS (SELECT 1 ord, 'Pos11' pos, '11' insGrp, 11 ins, 'deli111' deli, 'DelPos1111' DelPos FROM DUAL
UNION ALL
SELECT 1 ord, 'Pos11' pos, '11' insGrp, 11 ins, 'deli112' deli, 'DelPos1121' DelPos FROM DUAL
UNION ALL
SELECT 1 ord, 'Pos11' pos, '11' insGrp, 11 ins, 'deli112' deli, 'DelPos1122' DelPos FROM DUAL
UNION ALL
SELECT 2 ord, 'Pos21' pos, '21' insGrp, 21 ins, 'deli211' deli, 'DelPos2111' DelPos FROM DUAL
UNION ALL
SELECT 2 ord, 'Pos21' pos, '22' insGrp, 22 ins, 'deli221' deli, 'DelPos2211' DelPos FROM DUAL
UNION ALL
SELECT 2 ord, 'Pos21' pos, '22' insGrp, 22 ins, 'deli221' deli, 'DelPos2212' DelPos FROM DUAL
UNION ALL
SELECT 3 ord, 'Pos31' pos, '31' insGrp, 31 ins, 'deli311' deli, 'DelPos3111' DelPos FROM DUAL
UNION ALL
SELECT 3 ord, 'Pos32' pos, '31' insGrp, 31 ins, 'deli321' deli, 'DelPos3211' DelPos FROM DUAL
UNION ALL
SELECT 3 ord, 'Pos32' pos, '31' insGrp, 31 ins, 'deli321' deli, 'DelPos3212' DelPos FROM DUAL
UNION ALL
SELECT 3 ord, 'Pos32' pos, '31' insGrp, 31 ins, 'deli322' deli, 'DelPos3221' DelPos FROM DUAL)
SELECT UNIQUE ord,
SUM (ins) AS ins
FROM sample_data
GROUP BY ord, pos, deli, DelPos
ORDER BY ord;
或者创建并插入
create table tbl (ord number, pos varchar2(10), insGrp varchar2(10), ins number, deli varchar2(10), DelPos varchar2(10))
insert into tbl (SELECT 1 ord, 'Pos11' pos, '11' insGrp, 11 ins, 'deli111' deli, 'DelPos1111' DelPos FROM DUAL
UNION ALL
SELECT 1 ord, 'Pos11' pos, '11' insGrp, 11 ins, 'deli112' deli, 'DelPos1121' DelPos FROM DUAL
UNION ALL
SELECT 1 ord, 'Pos11' pos, '11' insGrp, 11 ins, 'deli112' deli, 'DelPos1122' DelPos FROM DUAL
UNION ALL
SELECT 2 ord, 'Pos21' pos, '21' insGrp, 21 ins, 'deli211' deli, 'DelPos2111' DelPos FROM DUAL
UNION ALL
SELECT 2 ord, 'Pos21' pos, '22' insGrp, 22 ins, 'deli221' deli, 'DelPos2211' DelPos FROM DUAL
UNION ALL
SELECT 2 ord, 'Pos21' pos, '22' insGrp, 22 ins, 'deli221' deli, 'DelPos2212' DelPos FROM DUAL
UNION ALL
SELECT 3 ord, 'Pos31' pos, '31' insGrp, 31 ins, 'deli311' deli, 'DelPos3111' DelPos FROM DUAL
UNION ALL
SELECT 3 ord, 'Pos32' pos, '31' insGrp, 31 ins, 'deli321' deli, 'DelPos3211' DelPos FROM DUAL
UNION ALL
SELECT 3 ord, 'Pos32' pos, '31' insGrp, 31 ins, 'deli321' deli, 'DelPos3212' DelPos FROM DUAL
UNION ALL
SELECT 3 ord, 'Pos32' pos, '31' insGrp, 31 ins, 'deli322' deli, 'DelPos3221' DelPos FROM DUAL)
我想你想要这个:
SELECT ord,
CASE WHEN COUNT (DISTINCT pos) = 1 THEN SUM(DISTINCT ins) ELSE MIN(ins) END AS ins
FROM sample_data
GROUP BY ord
ORDER BY ord;
ORD INS
--- ------
1 11
2 43
3 31
您能否共享创建脚本并以INSERT语句的形式提供一些示例数据?您所说的“另外,我希望能够分区…”是什么意思?一组人还不够吗?您能给出您的示例数据显示预期的输出吗?正如我所说,这是一个简单的测试,在我的最终请求中,我希望其他字段按不同的列分组。所以我不能按整个选择分组。预期结果是一样的。很好,谢谢!我用分区对它进行了调整,效果很好!当COUNT(DISTINCT pos)OVER(PARTITION BY ord)=1时,SUM(DISTINCT ins)OVER(PARTITION BY ord)或MIN(ins)OVER(PARTITION BY ord)结束为ins