Как изменить сложный запрос - PullRequest
1 голос
/ 24 июня 2019

У меня очень сложный запрос:

DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX),
        @archivedate date = '5/1/2019'; 

WITH 
E(n) AS(
    SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0))E(n)
),
E2(n) AS(
    SELECT a.n FROM E a, E b
),
E4(n) AS(
    SELECT a.n FROM E2 a, E2 b
),
cteTally(n) AS(
    SELECT TOP((SELECT TOP (1) COUNT(DISTINCT ratechangedate) datecount
                FROM MARS_DW.[dbo].[vw_GTMScheduledRateAndPaymentChangesWithAccountNumber_Archive]
                WHERE ArchiveDate = @archivedate
                GROUP BY account
                ORDER BY datecount DESC)) ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) n
    FROM E4
)        
SELECT @cols = (SELECT REPLACE( '
    ,MIN( CASE WHEN index_num = <<index_num>> THEN ratechangedate END) AS [date <<index_num>>]
    ,MIN( CASE WHEN index_num = <<index_num>> THEN new_noterate END)   AS [rate <<index_num>>]' , '<<index_num>>', n)
            FROM cteTally
            ORDER BY n
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 

set @query = 
N'WITH a AS (
    SELECT a.account,
        dense_rank() OVER ( PARTITION BY a.account ORDER BY ratechangedate) AS index_num,
        ratechangedate,
        new_noterate
    FROM MARS_DW.[dbo].[vw_GTMScheduledRateAndPaymentChangesWithAccountNumber_Archive] a
    WHERE archivedate = @date
    )
SELECT a.Account' + @cols + N'
FROM a
GROUP BY a.Account;'


EXECUTE sp_executesql @query, N'@date datetime', @date = @archivedate;

Я хочу получить те же результаты, но без извлечения аккаунта. Когда я удаляю a.Account, я получаю эту ошибку:

Сообщение 102, Уровень 15, Состояние 1, Строка 10
Неверный синтаксис рядом с ','.

Мои извинения Я очень новичок в SQL, поэтому я могу понять, почему это может быть не так актуально, как должно быть.

1 Ответ

1 голос
/ 24 июня 2019

Если вы хотите просто скрыть учетную запись из набора результатов, оставив все остальные данные одинаковыми, измените эту строку

SELECT a.Account' + @cols + N'

на

SELECT ' + STUFF(@cols, 1, <n>, '') + N'

, как сказал Йерун Мостерт.

Вам необходимо найти значение аргумента, которое должно быть числом первых пробелов плюс запятая в @cols.Смотри STUFF

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...