2016-07-29 3 views
0

Предположим, у меня есть таблица с тремя столбцами. Возможна ли сумма каждого столбца без указания имени столбца?Как суммировать динамические столбцы в SQL Server?

И существует ли возможность создать таблицу с динамическим именем столбца, а затем сумму каждого столбца?

ОБНОВЛЕНИЕ: Вот мой образец. Во-первых, я сделать запрос и получить результат, как этот:

--------- 
| Col | 
--------- 
| DLX | 
| SUI | 
| PRE | 
| TWQ | 
--------- 

Количество подряд, может быть разной каждый раз, а затем я создаю таблицу со столбцами из строк выше, как это:

--------------------------------- 
| DLX | SUI | PRE | TWQ | 
--------------------------------- 

И затем я заполняю данные таблицей из другой таблицы. В конце концов, я суммирую каждый столбец. Потому что я не буду точно знать имя столбца, поэтому мне нужна сумма каждого столбца без указания имени столбца.

+0

Вы хотите создать имена столбцов, которые включают сумму отдельных столбцов? (т. е. столбец 1 sum = 25, столбец 1 name = 'column 25'). –

+1

Если есть ТОЛЬКО 3 столбца, лучше написать запрос вручную. – gofr1

+0

, пожалуйста, укажите пример ввода и ожидаемый результат – TheGameiswar

ответ

2

Если ваш стол небольшой (то есть 10 столбцов), я бы просто сделал это вручную. Но если это похоже на 20+ столбцов, я бы использовал динамический sql.

Чтобы ответить на ваш вопрос напрямую, да, вы можете динамически создавать таблицу с динамическими именами столбцов, используя динамический sql.

Вот один из способов сделать это: Вы можете использовать INFORMATION_SCHEMA.COLUMNS View, чтобы получить все имена столбцов и поместить их в таблицу темп.

SELECT NAME INTO #COLUMNS 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = YourTable 

Затем создайте временную таблицу для хранения ваших сумм.

CREATE TABLE #SUMS (
COLUMN_NAME NVARCHAR(MAX), 
SUM_COLUMN INT 
) 

Затем вы можете использовать динамический sql и цикл для суммирования каждого столбца.

WHILE EXISTS(SELECT TOP 1 * FROM #COLUMNS) 
    BEGIN 
     DECLARE @COLUMN NVARCHAR(MAX) = (SELECT TOP 1 * FROM #COLUMNS) 
     DECLARE @DYNAMICSQL NVARCHAR(MAX) = N'SELECT ' + @COLUMN + ' AS COLUMN_NAME, SUM(' + @COLUMN + ') FROM YourTable' 

     INSERT INTO #SUMS 
     EXEC SP_EXECUTESQL @DYNAMICSQL 

     DELETE FROM #COLUMNS 
     WHERE NAME = @COLUMN 
    END 

Затем вам нужно будет еще один динамический SQL и цикл в цикле через новую таблицу и создать временную таблицу с именами столбцов, которые вы хотите, используя значения сумм и имя таблицы, которую вы хотите.

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

+0

* lol * несоответствие здесь. SQL должен быть написан в верхнем регистре. Часть с 'CREATE TABLE' неправильно отформатирована. Если вы отклоняете мое редактирование, пожалуйста, отформатируйте его самостоятельно. – gofr1

+0

Я имел в виду это, используя слово динамическое три раза в предложении и не издеваться над OP. Я удалю его. И ты прав. Я полностью забыл. –

0

Сначала я подумал о повороте, но затем пришел с этим:

DECLARE @Table TABLE ( --Table to generate input you need 
    [Col] nvarchar(3) 
) 
DECLARE @query nvarchar(max) -- a variable that will store dynamic SQL query 
DECLARE @table_name nvarchar(max) = 'Temp' --A name of table to create 

INSERT INTO @Table VALUES 
('DLX'), 
('SUI'), 
('PRE'), 
('TWQ') 

SELECT @query = ISNULL(@query,'CREATE '[email protected]_name+' TABLE (') + QUOTENAME([Col]) + ' nvarchar(max),' 
FROM @Table 

SELECT @query = SUBSTRING(@query,1,LEN(@query)-1) +')' 

EXEC sp_executesql @query 

Это будет выполнить запрос (PRINT @query, чтобы увидеть результат ниже):

CREATE Temp TABLE ([DLX] nvarchar(max),[SUI] nvarchar(max),[PRE] nvarchar(max),[TWQ] nvarchar(max)) 

Какой будет создавать темп стол для вас.

Тогда вы можете вставить в эту таблицу таким же образом.

Смежные вопросы