Es ist ein größeres Problem, das ignoriert wird: Es ist wahrscheinlich ein Grund dafür, dass der Text bereits ZZTotal
anstelle von Total
. Und dieser Grund ist höchstwahrscheinlich, um eine korrekte Reihenanordnung aufrechtzuerhalten (d. H. Die Summen unten zu halten). Die ZZTotal
Zeilen werden höchstwahrscheinlich automatisch vom SQL Server über die ROLLUP
Option der GROUP BY Klausel generiert. Anfangs platziert die ROLLUP
Option NULL
in jeder "Gruppe", die aufgerollt wird, da die Zeichenfolge "Total" (oder eine beliebige Zeichenfolge) nicht in eine Spalte von Nicht-String-Datentypen passt. Ich vermute, dass die Werte wurden mit ZZTotal
über ISNULL()
beim Ausgeben der Ergebnisse in #final
ersetzt.
Das aktuelle Problem ist, dass, wenn Sie die ZZTotal
Werte mit Total
ersetzen, dann den „Total“ Zeilen werden möglicherweise nicht an der Unterseite dieser Gruppierung sein, zumindest nicht für alle Gruppierungen, die Strings mit U...
beginnend enthalten oder Tp...
oder Tou...
und so weiter.
Der erste Schritt ist es, eine IDENTITY Spalte zu der #final
Tabelle hinzuzufügen. Dazu ändern Sie die Abfrage, die #final
erstellt und auffüllt, indem Sie IDENTITY(INT, 1, 1) AS [RowNum],
als erste Spalte der SELECT
-Anweisung hinzufügen.
Der zweite Schritt ist die ISNULL(column, 'ZZTotal')
der Abfrage zu ändern, die #final
auffüllt stattdessen sein (für Klasse 2, zum Beispiel):
IIF(GROUPING(class2) = 0, class2, N'Total for ' + class1) AS [Class2]
Bitte beachten Sie die Verwendung von „Class1“, nicht „Klasse 2“ , am Ende von N'Total for ' + class1
.
Der dritte/letzte Schritt besteht darin, ORDER BY [RowNum]
am Ende der Set @Sql=
Anweisung hinzuzufügen.Die letzte Abfrage sollte etwas sein wie:
SELECT Class1, Class2, Class3 FROM #final ORDER BY [RowNum];
Beispiel 1: ROLLUP- Standardverhalten
SELECT ss.[name] AS [SchemaName],
so.[type_desc] AS [ObjectType],
COUNT(*) AS [ObjectCount]
FROM [master].sys.schemas ss
INNER JOIN [master].sys.objects so
ON so.[schema_id] = ss.[schema_id]
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP;
Beispiel 2: ROLLUP- mit NULL-Werte in der Gruppierungs Reihen ersetzt
SELECT IIF(GROUPING(ss.[name]) = 0, ss.[name], N'Total') AS [SchemaName],
IIF(GROUPING(so.[type_desc]) = 0,
so.[type_desc],
IIF(GROUPING(ss.[name]) = 0,
N'Total for ' COLLATE Latin1_General_CI_AS_KS_WS + ss.[name],
N'---------------------------------------->')
) AS [ObjectType],
COUNT(*) AS [ObjectCount]
FROM [master].sys.schemas ss
INNER JOIN [master].sys.objects so
ON so.[schema_id] = ss.[schema_id]
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP;
Beispiel 3: Hinzufügen von Identity-Spalte und INTO-Klausel Beispiel # 2
SELECT IIF(GROUPING(ss.[name]) = 0, ss.[name], N'Total') AS [SchemaName],
IIF(GROUPING(so.[type_desc]) = 0,
so.[type_desc],
IIF(GROUPING(ss.[name]) = 0,
N'Total for ' COLLATE Latin1_General_CI_AS_KS_WS + ss.[name],
N'---------------------------------------->')
) AS [ObjectType],
COUNT(*) AS [ObjectCount],
IDENTITY(INT, 1, 1) AS [RowNum]
INTO #TempResults
FROM [master].sys.schemas ss
INNER JOIN [master].sys.objects so
ON so.[schema_id] = ss.[schema_id]
GROUP BY ss.[name], so.[type_desc] WITH ROLLUP;
SELECT * FROM #TempResults ORDER BY [RowNum];
Ihre Frage fehlt jeden Kontext verständlich zu machen. Ich kann nicht davon erzählen, was du versuchst zu tun oder was das Problem ist. Du kannst hier anfangen. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
@Sean Lange Ich habe die Frage geändert – user1554650
Nun, die Frage ist sicherlich anders Leider ist es nicht klarer als vorher. Ich wäre misstrauisch bei einer Abfrage mit dynamisch ausgewählten Spalten. Wenn Sie mit dynamic sql festgefahren sind, müssen Sie durch einige ernsthafte Hürden springen, um das durchzuziehen. Sie müssen hier eine Menge mehr Informationen zur Verfügung stellen. Sie werden wahrscheinlich einen String-Splitter benötigen, um Ihren dynamischen SQL-Server neu aufzubauen. –