Вычислить несколько столбцов друг с другом с помощью CTE
Я очень новичок в этом сайте, ко всему. И я не знал, как спросить. Так что я задал 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 с новым вычисляемым столбцом как Column2. Но теперь он должен быть обновлен с помощью только что вычисленной колонки Column2 и предыдущей записи Column3. Если вы хотите посмотреть предыдущий пост, вот он .
Я с нетерпением жду любого ответа, и он будет оценен. заранее спасибо
Dok
Прежде всего, спасибо вам, ребята, за все ваши идеи.
Я снова объясняю, потому что это было непонятно.
Вот мой предыдущий рекурсивный код CTE. Он работает как 1-й, вычисляет столбец2 с предыдущей записью текущего столбца (c.Column2) в cteCalculation, а затем вычисляет новый столбец3 в cte2 с только что вычисленным столбцом2 из 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 столбца с данными друг от друга. Значит, используйте 2-й для расчета 3-го и используйте 3-й для получения новых данных 2-го столбца. Надеюсь, вы сможете это получить.
Dok
Это пример того, как добиться этого, используя рекурсивный 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
Вам нужно будет использовать рекурсивный CTE, поскольку значения последующих столбцов зависят от предыдущих результатов.
Делайте это и в кусках. Ваш первый запрос просто вернет правильные значения для Column1
. Ваш следующий (рекурсивный CTE) запрос добавит результаты для Column2
и т. Д.
OK Я предполагаю, что вы вставляете вставки в колонку 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
Триггер имеет доступ как к существующим (старым) значениям в Tablename t, так и к вставленному новому (Inserted.col1).