Как динамически добавлять столбцы? - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть следующие данные, которые используются для расчета ежедневного события.Число столбцов меняется ежедневно, например, первый день может быть от 1 до 5, второй день от 1 до 8, третий день от 1 до 10 и т. Д. Поэтому я использовал динамический поворот, чтобы получить столбцы и вставить его во временную таблицу ##No.из таблицы я хочу сложить значение от 1 до N-го столбца, чтобы получить общий итог.

Данные

CREATE TABLE ##TBL (Number INT, Months VARCHAR(10), Total INT)
INSERT INTO ##TBL VALUES
(3,'Dec',1),(10,'Dec',1),(8,'Dec',1),(6,'Mar',1),(9,'Mar',1),(6,'Mar',1),(3,'Dec',1),(5,'Mar',1),(3,'Mar',1),
(2,'Mar',1),(10,'Dec',1),(7,'Mar',1),(3,'Mar',1),(6,'Dec',1),(4,'Mar',1),(9,'Dec',1),(1,'Mar',1),(3,'Mar',1),
(5,'Dec',1),(9,'Dec',1),(5,'Mar',1),(8,'Mar',1),(7,'Mar',1),(5,'Mar',1),(4,'Mar',1),(8,'Mar',1),(3,'Mar',1),
(7,'Mar',1),(5,'Mar',1),(2,'Mar',1),(6,'Mar',1),(2,'Mar',1),(8,'Dec',1),(1,'Mar',1),(5,'Mar',1),(6,'Mar',1),
(8,'Mar',1),(3,'Mar',1),(9,'Dec',1),(5,'Dec',1),(8,'Dec',1),(7,'Dec',1),
(5,'Dec',1)

сводная таблица для получения выходных данных

DECLARE @Numb AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

SET @Numb =(SELECT SUBSTRING(
(
    SELECT distinct', ' + QUOTENAME(Number) AS 'data()'
        FROM ##TBL
        FOR XML PATH('')        
), 2 , 9999) As nums)

SET @query =
'SELECT * 
INTO ##NO
FROM ##TBL
        PIVOT
        ( SUM(Total) FOR Number IN ('+@Numb+')) PV'

EXEC (@query)
SELECT 
*,
ISNULL([1],0)+ISNULL([2],0)+ISNULL([3],0)+ISNULL([4],0)+ISNULL([5],0)+ISNULL([6],0)+ISNULL([7],0)+
ISNULL([8],0)+ISNULL([9],0)+ISNULL([10],0) AS Grand_Total

FROM ##NO
DROP TABLE ##NO

текущий вывод

Months  1    10  2    3  4    5 6   7   8   9   Grand_Total
 Dec    NULL 2   NULL 2  NULL 3 1   1   3   3    15
 Mar    2   NULL 3    5  2    5 4   3   3   1    28

Есть ли способ, которым я могу динамически суммировать столбцы всякий раз, когда столбцы уменьшаются или увеличиваются в конце?Столбцы всегда начинаются с 1,2,3… .n, и меня не особо беспокоит порядок столбцов

Требуемый выходной день 1

Months  1     2     3   4     5  Grand_Total
Dec     NULL  NULL  2   NULL  3  5
Mar     2     3     5   2     5  17

Требуемый выходной день 2

Months  1   2     3  Grand_Total        
Dec    NULL NULL  2  2      
Mar     2   3     5  10     

Я хочу, чтобы когда-либо увеличивались или уменьшались данные столбца числа.Я хочу иметь возможность добавить их.Иногда число начинается с 1 до 5, еще раз с 1 по 7, еще раз с 1 по 8 и т. Д.

1 Ответ

0 голосов
/ 24 сентября 2018

Вы можете использовать это, чтобы получить сумму динамически.

declare @SUM nvarchar(max) = ''

SELECT @SUM = @SUM + 'ISNULL(' + QUOTENAME(Number) + ',0)+'
FROM ##TBL
group by Number

select @SUM = left(@SUM, len(@SUM) - 1)

Затем добавить ее в свой запрос довольно просто.

SET @query =
'SELECT *, Grand_Total = ' + @SUM
+ 'INTO ##NO
FROM ##TBL
        PIVOT
        ( SUM(Total) FOR Number IN ('+@Numb+')) PV'

Таким образом, полностью функциональный код будет выглядеть следующим образом.

CREATE TABLE ##TBL (Number INT, Months VARCHAR(10), Total INT)
INSERT INTO ##TBL VALUES
(3,'Dec',1),(10,'Dec',1),(8,'Dec',1),(6,'Mar',1),(9,'Mar',1),(6,'Mar',1),(3,'Dec',1),(5,'Mar',1),(3,'Mar',1),
(2,'Mar',1),(10,'Dec',1),(7,'Mar',1),(3,'Mar',1),(6,'Dec',1),(4,'Mar',1),(9,'Dec',1),(1,'Mar',1),(3,'Mar',1),
(5,'Dec',1),(9,'Dec',1),(5,'Mar',1),(8,'Mar',1),(7,'Mar',1),(5,'Mar',1),(4,'Mar',1),(8,'Mar',1),(3,'Mar',1),
(7,'Mar',1),(5,'Mar',1),(2,'Mar',1),(6,'Mar',1),(2,'Mar',1),(8,'Dec',1),(1,'Mar',1),(5,'Mar',1),(6,'Mar',1),
(8,'Mar',1),(3,'Mar',1),(9,'Dec',1),(5,'Dec',1),(8,'Dec',1),(7,'Dec',1),
(5,'Dec',1)

DECLARE @Numb AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);

SET @Numb =(SELECT SUBSTRING(
(
    SELECT distinct', ' + QUOTENAME(Number) AS 'data()'
        FROM ##TBL
        FOR XML PATH('')        
), 2 , 9999) As nums)

declare @SUM nvarchar(max) = ''

SELECT @SUM = @SUM + 'ISNULL(' + QUOTENAME(Number) + ',0)+'
FROM ##TBL
group by Number


select @SUM = left(@SUM, len(@SUM) - 1)

SET @query =
'SELECT *, Grand_Total = ' + @SUM
+ 'INTO ##NO
FROM ##TBL
        PIVOT
        ( SUM(Total) FOR Number IN ('+@Numb+')) PV'

select @query

EXEC (@query)

select * from ##NO

DROP TABLE ##NO

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