Модификация Roll Up SQL

У меня есть этот SQL:

DECLARE @table TABLE(col1 INT, col2 FLOAT);

INSERT INTO @table  (col1, col2) 
VALUES (1, 500), (2, 499), (3, 200), (4, 50), (5, 10), (6, 5)

DECLARE @col2total FLOAT = (SELECT SUM(col2) FROM @table)

-- Using subqueries
SELECT      col1, 
            col2, 
            (SELECT SUM(col2) FROM @table sub WHERE sub.col1 <= base.col1) 
            / @col2total
            * 100 AS RunningPercentage
FROM        @table base
ORDER BY    col1

-- Using cross join
SELECT      t1.col1,
            t1.col2,
            SUM (t2.col2) RunningTotal,
            SUM (t2.col2) / @col2total * 100 RunningPercentage
FROM        @table t1 CROSS JOIN @table t2
WHERE       t1.col1 >= t2.col1
GROUP BY    t1.col1, t1.col2
ORDER BY    t1.col1

Этот код свернет счет и предоставит процентную долю для данного конкретного пункта в сводке.

Мой вопрос: этот скрипт требовал жесткого кодирования начальных значений. Как именно это сделать с помощью оператора SQL, извлекающего значения из таблицы в базе данных SQL?

Другими словами, От:

INSERT INTO @table (col1, col2) 
VALUES (1, 500), (2, 499), (3, 200), (4, 50), (5, 10), (6, 5)

Удалите часть "значений" снизу и замените ее внутри "выберите [имена полей] из [Имя таблицы"

1 ответ

Решение

Вы ищете вставку из выбранного синтаксиса

INSERT INTO @table (col1, col2) 
select col1, col2 
  from Sourcetable --replace it with your sourcetable name

Также, если вы используете sql server 2012+то вот эффективный способ подсчета промежуточного итога

SELECT col1,
       col2,
       RunningTotal = Sum(col2)OVER(ORDER BY col1),
       RunningPercentage = Sum(col2)OVER(ORDER BY col1) / Sum(col2)OVER() * 100
FROM   @table base
ORDER  BY col1 
Другие вопросы по тегам