Существует большая проблема, которая игнорируется: есть, скорее всего, причина того, что текст уже ZZTotal
вместо Total
. И эта причина, скорее всего, для поддержания правильного упорядочения строк (т. Е. Сохранения итогов в нижней части).
Строки ZZTotal
, скорее всего, автоматически генерируются SQL Server с помощью опции ROLLUP
в предложении GROUP BY. Первоначально параметр ROLLUP
помещает NULL
в каждую «группу», которая свертывается, так как строка «Всего» (или любая строка) не помещается в столбец нестроковых типов данных. Я предполагаю, что значения NULL
были заменены на ZZTotal
через ISNULL()
при сдаче результатов в #final
.
Текущая проблема заключается в том, что если заменить ZZTotal
значения с Total
, то «Всего» строки, возможно, не будут в нижней части этой группировки, по крайней мере, не для каких-либо групп, которые содержат строки, начинающиеся с U...
или Tp...
, или Tou...
, и так далее.
Первым шагом является добавление IDENTITY столбец в таблице #final
. Вы делаете это, изменяя запрос, который создает и заполняет #final
, добавив IDENTITY(INT, 1, 1) AS [RowNum],
в качестве первого столбца инструкции SELECT
.
Второй шаг, чтобы изменить ISNULL(column, 'ZZTotal')
запроса, который заполняет #final
вместо этого будет (для Class2, например):
IIF(GROUPING(class2) = 0, class2, N'Total for ' + class1) AS [Class2]
Обратите внимание на использование «class1», а не «class2» , в конце N'Total for ' + class1
.
Третий/конечный шаг состоит в том, чтобы добавить ORDER BY [RowNum]
в конец заявления Set @Sql=
.Окончательный запрос должен быть чем-то вроде:
SELECT Class1, Class2, Class3 FROM #final ORDER BY [RowNum];
Пример 1: ROLLUP поведение по умолчанию
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;
Пример 2: ROLLUP нулями заменены в GROUPING рядами
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;
Пример 3: Добавление столбца IDENTITY и INTO пункта к примеру # 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];
Ваш вопрос не имеет никакого контекста, чтобы сделать его понятным. Я не могу сказать, прочитав это, что вы пытаетесь сделать или что проблема. Вы можете начать здесь. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –
@Sean Lange Я изменил вопрос – user1554650
Ну, конечно, вопрос разный , к сожалению, это не более понятно, чем было раньше. Я бы назвал запрос с динамическим выбором столбцов таким образом. Если вы застряли с использованием динамического sql, вам придется преодолеть некоторые серьезные препятствия, чтобы снять это. Вам нужно предоставить более подробную информацию здесь. Скорее всего, вам понадобится сплиттер строк для восстановления динамического sql. –