2016-07-29 20 views
0

Angenommen, ich habe eine Tabelle mit 3 Spalten. Gibt es eine mögliche Summe jeder Spalte ohne den Namen der Spalte anzugeben?Wie summiere dynamische Spalten in SQL Server?

Und ist es möglich, eine Tabelle mit dynamischem Namen der Spalte und dann Summe jeder Spalte zu erstellen?

UPDATE: Hier ist meine Probe. Zuerst muss ich eine Abfrage und erhalten das Ergebnis wie folgt aus:

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

Die Anzahl der Reihe vielleicht jedes Mal anders, und dann erstelle ich eine Tabelle mit Spalten von Zeilen oben wie folgt aus:

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

Und dann fülle ich die Daten aus einer anderen Tabelle. Immerhin summiere ich jede Spalte. Weil ich den Namen der Spalte nicht genau weiß, brauche ich die Summe jeder Spalte, ohne den Namen der Spalte anzugeben.

+0

Wollen Sie Spaltennamen erstellen, die die Summe der einzelnen Spalten enthalten? (d. h. Spalte 1 Summe = 25, Spalte 1 Name = "Spalte 25"). –

+1

Wenn es nur 3 Spalten gibt, ist es besser, Ihre Abfrage manuell zu schreiben. – gofr1

+0

Bitte geben Sie Beispieleingabe und erwartetes Ergebnis – TheGameiswar

Antwort

2

Wenn Ihre Tabelle klein ist (d. H. 10 Spalten) würde ich es einfach manuell tun. Aber wenn es 20+ Spalten ist, würde ich einige dynamische SQL verwenden.

Um Ihre Frage direkt zu beantworten, können Sie dynamisch eine Tabelle mit dynamischen Spaltennamen mit dynamic sql erstellen.

Hier ist ein Weg, es zu tun: Sie können INFORMATION_SCHEMA.COLUMNS View verwenden, um alle Spaltennamen zu bekommen und sie in eine temporäre Tabelle zu setzen.

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

Als nächstes erstellen Sie eine temporäre Tabelle, um Ihre Summen zu speichern.

Sie können dann dynamische sql und eine Schleife verwenden, um jede Spalte zu summieren.

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 

Dann müssen Sie eine weitere dynamische SQL und Schleife durch die neue Tabelle Schleife und erstellen Sie eine temporäre Tabelle mit den Spaltennamen Sie die Summenwerte verwenden mögen, und die Tabellennamen Sie wollen.

Sie sollten das mit dem oben bereits bereitgestellten Code tun können.

+0

* lol * ist hier unpassend. SQL muss in Großbuchstaben geschrieben werden. Der Teil mit 'CREATE TABLE' ist nicht richtig formatiert. Wenn Sie meine Bearbeitung ablehnen, formatieren Sie sie bitte selbst. – gofr1

+0

Ich meinte es als das Wort dynamisch drei Mal im Satz zu verwenden und das OP nicht zu verspotten. Ich werde es entfernen. Und du hast Recht. Ich hab es total vergessen. –

0

Zuerst dachte ich über Schwenk aber dann kam mit dieser:

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 

, dass eine Abfrage ausgeführt wird (PRINT @query das Ergebnis unten sehen):

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

, die eine temporäre schaffen Tisch für dich.

Dann können Sie in der Tabelle in der gleichen Weise einfügen.