2014-10-29 2 views
0

У меня есть две таблицыОбновление колонки GROUP BY SUM

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

Я хочу, чтобы вычислить процент раскола, так что если у меня есть одно значение code_ID в таблице С, которая связывает два grp_ids в TableB, он должен расстаться. (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)) 
+0

Какую базу данных ты используешь? –

+0

@MarkusJarderot: SQL Server 2012, Любая база данных. Как это имеет значение? –

+0

@BhupinderSingh, это имеет значение, поскольку каждая СУБД имеет свою структуру. – Rahul

ответ

0

Использование стандартного 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 
+0

Это дает мне 0 в результате для split для всех случаев. –

+0

Справа. 'PAmt' был определен как' int', поэтому деление стало целочисленным. Я добавил '1.0 *', чтобы заставить его 'float'. В некоторых базах данных вам может потребоваться явно указать его на 'float' или' real'.' –