当值与其他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的行
我想根据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