Рассчитать несколько столбцов друг с другом, используя CTE - PullRequest
3 голосов
/ 17 июня 2011

Я очень новичок в этом сайте, во всем. И я не знал, как спросить. Так что я задал 1 проблему раньше (я отправил ее в качестве ответа), и я снова опубликовал решение, как я сделал Все ваши идеи помогли мне решить ее.

Теперь вот появилась новая проблема.

Я хочу построить столбцы, которые рассчитываются друг с другом. (Извините за мой английский) Пример:

Id   Column1    Column2                                                           Column3
1    5          5 => Same as Column1                                              5 => Same as Column2
2    2          12 => column1 current + column2.prev + column3.previous = 2+5+5   17 => column2.current + column3.prev = 12+5
3    3          32 => 3+12+17                                                     49 => 32+17

более простой способ увидеть:

Id   Column1    Column2                  Column3
1    5          5 => Same as Column1     5 => Same as Column2
2    2          12 =>   2+5+5            17 => 12+5
3    3          32 =>   3+12+17          49 => 32+17

так сложно ??? : - (

В предыдущей проблеме вычислялся Столбец3 с новым вычисляемым столбцом как Столбец2. Но теперь он должен быть обновлен с только что рассчитанным Column2 и предыдущей записью Column3. Если вы хотите взглянуть на предыдущий пост, здесь это .

Я с нетерпением жду любого ответа, и он будет оценен по достоинству. Заранее спасибо

Dok


Прежде всего, спасибо вам, ребята, за все ваши идеи.

Я снова объясняю, потому что это было не ясно.

Вот мой предыдущий рекурсивный код CTE. Он работает следующим образом: сначала вычислите column2 с предыдущей записью текущего столбца (c.Column2) в cteCalculation, а затем вычислите новый столбец 3 в cte2 с только что вычисленным column2 из cteCalculation.

/ скопировано из предыдущего поста /

;with cteCalculation as (
    select t.Id, t.Column1, t.Column1 as Column2
        from table_1 t
        where t.Id = 1
    union all
    select t.Id, t.Column1, (t.Column1 + c.Column2) as Column2
        from table_1 t
            inner join cteCalculation c
                on t.Id-1 = c.id
),
cte2 as(
select t.Id, t.Column1 as Column3
        from table_1 t
        where t.Id = 1
    union all
    select t.Id, (select column2+1 from cteCalculation c where c.id = t.id)  as Column3
        from table_1 t
            inner join cte2 c2
                on t.Id-1 = c2.id
)

select c.Id, c.Column1, c.Column2, c2.column3
    from cteCalculation c
inner join cte2 c2 on c.id = c2. id

Теперь я хочу расширить его, как рассчитать 2 столбца с данными друг от друга. Значит, используйте 2nd, чтобы вычислить третий, и используйте 3rd, чтобы получить новые данные второго столбца. Надеюсь, ты сможешь получить это.

Dok

Ответы [ 3 ]

1 голос
/ 20 июня 2011

Это пример того, как этого добиться с помощью рекурсивного CTE

create table #tmp (id int identity (1,1), Column1 int)
insert into #tmp values(5)
insert into #tmp values(2)
insert into #tmp values(3);

with counter as
(
    SELECT top 1 id, Column1, Column1 as Column2, Column1 as Column3 from #tmp
    UNION ALL 
    SELECT t.id, t.Column1, 
           t.Column1 + counter.Column2 + counter.Column3, 
           (t.Column1 + counter.Column2 + counter.Column3) + counter.Column3 FROM counter
    INNER JOIN #tmp t ON t.id =  counter.id + 1
)

select * from counter
0 голосов
/ 17 июня 2011

ОК. Я предполагаю, что вы делаете вставки в столбец 1 различных значений.

По существу, col2 всегда = новое значение col1 + старое значение col2 + старое значение col 3 col3 = новое значение col2 + старое значение col3 поэтому col3 = (новое значение col1 + старое значение col2 + старое значение col 3) + старое значение col3

Таким образом, триггер INSTEAD OF Insert, вероятно, является самым простым способом реализации.

 CREATE TRIGGER tr_xxxxx ON Tablename

 INSTEAD OF INSERT

 AS

 INSERT INTO Tablename (Column1, Column2, Column3)
 SELECT ins.col1, ins.col1+t.col2+t.col3, ins.col1+t.col2+t.col3+t.col3
 FROM Tablename t INNER JOIN Inserted ins on t.Id = ins.Id

Триггер имеет доступ как к существующим (старым) значениям в имени таблицы t, так и к добавляемому новому значению (Inserted.col1).

0 голосов
/ 17 июня 2011

Вам нужно будет использовать Recursive CTE , поскольку значения последующих столбцов зависят от более ранних результатов.

Делайте это также по частям.Ваш первый запрос просто вернет правильные значения для Column1.Ваш следующий (рекурсивный CTE) запрос добавит результаты для Column2 и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...