2016-07-29 6 views
0

Supposons que j'ai une table avec 3 colonnes. Y a-t-il une somme possible de chaque colonne sans spécifier le nom de la colonne?Comment faire la somme des colonnes dynamiques dans SQL Server?

Et est-il possible de créer une table avec le nom dynamique de la colonne, puis la somme de chaque colonne?

MISE À JOUR: Voici mon exemple. D'abord, je fais une requête et obtenir le résultat comme celui-ci:

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

Le nombre de ligne peut-être différent à chaque fois, puis je crée une table avec des colonnes de lignes ci-dessus comme ceci:

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

Et puis je remplir les données de la table d'une autre table. Après tout, je somme chaque colonne. Parce que je ne saurai pas exactement le nom de la colonne, donc j'ai besoin de la somme de chaque colonne sans spécifier le nom de la colonne.

+0

Voulez-vous dire que vous voulez créer des noms de colonne qui incluent la somme des colonnes individuelles? (i.e colonne 1 somme = 25, colonne 1 nom = "colonne 25"). –

+1

S'il n'y a que 3 colonnes, il est préférable d'écrire votre requête à la main. – gofr1

+0

veuillez fournir un exemple d'entrée et le résultat attendu – TheGameiswar

Répondre

2

Si votre tableau est petit (c'est-à-dire 10 colonnes), je le ferais manuellement. Mais si c'est plus de 20 colonnes, j'utiliserais un SQL dynamique.

Pour répondre directement à votre question, vous pouvez créer dynamiquement une table avec des noms de colonnes dynamiques à l'aide de SQL dynamique.

Voici une façon de le faire: Vous pouvez utiliser INFORMATION_SCHEMA.COLUMNS View pour obtenir tous les noms des colonnes et les mettre dans une table temporaire.

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

Ensuite, créez une table temporaire pour stocker vos sommes.

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

Vous pouvez ensuite utiliser SQL dynamique et une boucle pour additionner chaque colonne.

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 

Ensuite, vous besoin d'une autre sql dynamique et boucle en boucle à travers la nouvelle table et créer une table temporaire avec les noms de colonnes que vous voulez utiliser les valeurs de somme et le nom de la table que vous voulez.

Vous devriez pouvoir le faire en utilisant le code déjà fourni ci-dessus.

+0

* lol * est incongrue ici. SQL doit être écrit en majuscules. La partie avec 'CREATE TABLE' n'est pas correctement formatée. Si vous rejetez ma modification, veuillez la formater par vous-même. – gofr1

+0

Je voulais dire utiliser le mot dynamique trois fois dans la phrase et ne pas se moquer de l'OP. Je vais l'enlever. Et tu as raison. J'ai complètement oublié. –

0

Au début, je pensais à faire pivoter mais est venu avec ceci:

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 

qui exécutera une requête (PRINT @query pour voir le résultat ci-dessous):

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

qui va créer une température table pour toi.

Ensuite, vous pouvez insérer dans cette table de la même manière.