簡體   English   中英

更新列GROUP BY SUM

[英]Updating a column GROUP BY SUM

我有兩張桌子

CREATE TABLE TableB (Grp_ID int, PAmt int, Split float)
CREATE TABLE TableC (Grp_ID int,Code_ID int)

我想計算拆分的百分比,以便如果我在表C中具有一個code_ID值,該值鏈接到tableB中的兩個grp_ids,則應該拆分。 (PAmt / SUM(PAmt))換句話說,

Case1  
INSERT INTO TableB (Grp_ID, PAmt)
VALUES (1234,2280) , (1235,3420);

INSERT INTO TableC (Grp_ID,Code_ID)
VALUES (1234,102) , (1235,102)

Expected Result:
TableB
grp_ID  PAmt Split
1234    2280  0.4  (2280 / (2280+3420))
1235    3420  0.6  (3420 / (2280+3420))

Case2 

INSERT INTO TableB (Grp_ID, PAmt)
VALUES (5174,1400) , (5175,2400);

INSERT INTO TableC (Grp_ID,Code_ID)
VALUES (5174,009) , (5175,010)

Expected Result:
TableB
grp_ID  PAmt Split
5174    1400  1 (because there is only one code for 5174) (1400/1400)
5175    2400  1 (because there is only one code for 5175) (2400/2400)



Case3 

INSERT INTO TableB (Grp_ID, PAmt)
VALUES (1111,480) , (1112,480) ,(1113,480) , (1114,960) ;

INSERT INTO TableC (Grp_ID,Code_ID)
VALUES (1111,777) , (1112,777) , (1113,778),(1114,778)

Expected Result:
TableB
grp_ID  PAmt Split
1111    480  0.50   ( 480 / (480+480))
1112    480  0.50   ( 480 / (480+480))
1113    480  0.33   ( 480 / (480+960))
1114    960  0.67   ( 960 / (480+960))

使用標准的SQL99:

SELECT
    TableB.Grp_ID, TableB.PAmt,
    1.0 * TableB.PAmt / x.Sum_PAmt AS Split
FROM TableB
INNER JOIN TableC ON TableC.Grp_ID = TableB.Grp_ID
INNER JOIN (
  SELECT TableC.Code_ID, SUM(TableB.PAmt) AS Sum_PAmt
  FROM TableB
  INNER JOIN TableC ON TableC.Grp_ID = TableB.Grp_ID
  GROUP BY TableC.Code_ID
) AS x ON x.Code_ID = TableC.Code_ID

使用某些數據庫支持的SQL2003的窗口函數:

SELECT
    TableB.Grp_ID, TableB.PAmt,
    1.0 * TableB.PAmt / SUM(TableB.PAmt) OVER (PARTITION BY TableC.Code_ID) AS Split
FROM TableB
INNER JOIN TableC ON TableC.Grp_ID = TableB.Grp_ID

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM