2017-03-09 106 views
1

我有以下SAMPLE_DATA數據集:的Oracle SQL SELECT SUM當值與其他GROUP BY子句不同

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,只有一個INSGRP
  • 當只有一個爲ORD POS,可以有很多INSGRP
  • 這是我的實際要求的一個簡單的版本,只有揭露這個問題
  • 一個ORD可以有很多DELI
  • 一個DELI可以有很多DELPOS
  • 德利DELPOS在那裏添加複製ORD-POS-INSGRP-INS

我要總結取決於ORD,POS和INSGRP INS列行。

  • 當只有一個POS的INSGRP時,我希望INS保持不變。
  • 當有許多INSGRP的POS,我想不同的INSGRP的INS的總和爲POS

所以我想下面的結果:

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添加到GROUP BY子句中,但它只在兩行中分隔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 

有人可以幫助我?


這裏的要求絲毫SAMPLE_DATA:

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) 
+0

您可以共享創建腳本並以INSE的形式提供一些樣本數據RT語句? –

+0

你是什麼意思「另外,我想分區...」?是不是足夠的GROUP BY?根據您的樣本數據,您能否顯示預期的輸出? –

+0

就像我說過的,這是一個簡單的測試,在我最後的請求中我想要其他字段的GROUP BY不同的列。所以我不能GROUP BY整個SELECT。預期的結果是一樣的。 –

回答

2

我想你想要這樣的:

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 
+0

很好,謝謝!我用PARTITION調整它,它效果很好! (DISTINCT pos)OVER(DISTINCT IN)= 1 THEN SUM(DISTINCT INS)OVER(PARTITION BY ORD)ELSE MIN(INS)OVER(PARTITION BY ORD)END AS –