Значения суммы в SQL до достижения определенного значения в другом столбце - PullRequest
1 голос
/ 21 июня 2019

У меня есть следующие 2 таблицы:

Col1|Col2|Col3
Val1 T1  
Val2 T2

Col1|Col2|Col3|Col4
Val1 test  1    
Val1 test  2
Val1 T1    3
Val2 test  1
Val2 T2    2

Мне нужно обновить значения для Col3 из Table 1 суммированием Col3 таблицы 2, пока Col2 таблицы 2 не достигнет значения из Col2 таблицы 1. Таким образом, таблица 1 должна выглядеть следующим образом:

Col1|Col2|Col3
Val1 T1    6
Val2 T2    3

Таким образом, он складывает 1+2+3 = 6 для T1 и 1+2 = 3 для T2.

По сути, ключом будет Col1 для обеих таблиц. Я использую MSSQL2008 сервер. Я пытался сделать это с помощью курсора, но пока не повезло Обратите внимание, что порядок по столбцу в таблице 2 является столбцом Дата (столбец 4). Заказано Desc.

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Вы можете получить это GROUP BY:

CREATE TABLE #Table1(Col1 VARCHAR(10),Col2 VARCHAR(10),Col3 INT)
CREATE TABLE #Table2(Col1 VARCHAR(10),Col2 VARCHAR(10),Col3 INT,Col4 DATETIME)

INSERT INTO #Table1 VALUES('Val1','T1',0)
INSERT INTO #Table1 VALUES('Val2','T2',0)

INSERT INTO #Table2 VALUES('Val1','test',1,GETDATE())
INSERT INTO #Table2 VALUES('Val1','test',2,GETDATE()-1)
INSERT INTO #Table2 VALUES('Val1','T1',3,GETDATE()-2)
INSERT INTO #Table2 VALUES('Val1','test',4,GETDATE()-3)
INSERT INTO #Table2 VALUES('Val2','test',1,GETDATE())
INSERT INTO #Table2 VALUES('Val2','T2',2,GETDATE()-1)

UPDATE T1
SET T1.Col3 = T2.SummationValue
FROM #Table1 T1
JOIN (
    SELECT T2.Col1,T2.Col2,SUM(T2.Col3) OVER(PARTITION BY T2.Col1 ORDER BY Col4 DESC)SummationValue
    FROM #Table2 T2
    JOIN #Table1 T1 ON T2.Col1 = T1.Col1
    )T2
ON T1.Col1 = T2.Col1 AND T1.Col2 = T2.Col2


SELECT * FROM #Table1

DROP TABLE #Table1
DROP TABLE #Table2

Выход:

Col1    Col2    Col3
Val1    T1      6
Val2    T2      3

SQL Fiddle

1 голос
/ 21 июня 2019

Это немного сложно.Вы можете получить точку отсечения, используя коррелированный подзапрос:

update t1
    set col3 = t2.sum_col3
from t1 join
     (select t2.col1, sum(t2.col3) as sum_col3
      from t2 
      where t2.t4 >= (select tt2.t4
                      from t2 tt2 join
                           t1 tt1
                           on tt2.col1 = tt1.col1 and
                              tt2.col2 = tt1.col2
                     )
      group by t2.col1
     ) t2
     on t2.col1 = t1.col1;

В качестве альтернативы, вы можете использовать оконные функции (но не кумулятивную сумму):

update t1
    set col3 = t2.sum_col3
from t1 join
     (select t2.col1,
             sum(t2.col3) as sum_col3
      from (select t2.col1,
                   min(case when tt2.col1 = tt1.col2 then tt2.col4 end) over (partition by tt2.col1) as col4_match
            from t2 tt2 join
                 t1 tt1
                 on tt2.col1 = tt1.col1                           
           ) t2
      where col4 >= col4_match
      group by t2.col1
     ) t2
     on t2.col1 = t1.col1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...