Как заменить значения NULL пустой строкой в ​​динамическом сводном запросе - PullRequest
1 голос
/ 09 июля 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,
        CONVERT(VARCHAR(10),ratechangedate,101)[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;

Который производит этот вывод:

enter image description here

Я хочу удалить значения NULL и заменить его пустой строкой. Я попытался просто вставить ISNULL(CONVERT(VARCHAR(10),ratechangedate,101),'') и ISNULL(new_noterate,'') в часть кода @query, но получаю следующие ошибки:

Сообщение 207, Уровень 16, Состояние 1, Строка 10
Неверное имя столбца "ratechangedate".

Сообщение 207, Уровень 16, Состояние 1, Строка 12
Недопустимое имя столбца rate rateateate.

Сообщение 207, Уровень 16, Состояние 1, Строка 14
Неверное имя столбца 'ratechangedate'.

...... и так далее для каждой другой "строки" до значения 34 .......

Любая помощь будет оценена.

1 Ответ

1 голос
/ 09 июля 2019

Попробуйте это:

DECLARE @cols NVARCHAR(MAX), @query NVARCHAR(MAX), @archivedate DATE = '2019-01-05'; 

DECLARE @HowMany INT = 
                (
                    SELECT TOP(1) COUNT(DISTINCT a.ratechangedate) AS [datecount]
                    FROM MARS_DW.[dbo].[vw_GTMScheduledRateAndPaymentChangesWithAccountNumber_Archive] a
                    WHERE a.ArchiveDate = @archivedate
                    GROUP BY a.account
                    ORDER BY [datecount] DESC
                )
;
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 CROSS JOIN E b)
    ,E4(n) AS (SELECT a.n FROM E2 a CROSS JOIN E2 b)
    ,cteTally(n) AS (SELECT TOP(@HowMany) ROW_NUMBER()OVER(ORDER BY (SELECT NULL)) n FROM E4)      
SELECT @cols = (SELECT REPLACE( N'
    ,COALESCE(CONVERT(NVARCHAR(255),MIN( CASE WHEN index_num = <<index_num>> THEN ratechangedate END)),'''') AS [date <<index_num>>]
    ,COALESCE(CONVERT(NVARCHAR(255),NULLIF(MIN( CASE WHEN index_num = <<index_num>> THEN new_noterate END),0)),'''') AS [rate <<index_num>>]
                ' 
                , '<<index_num>>', n)
            FROM cteTally
            ORDER BY n
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
;

SET @query = 
N'WITH ct AS (
    SELECT a.account
        ,DENSE_RANK()OVER(PARTITION BY a.account ORDER BY a.ratechangedate) AS [index_num]
        ,CONVERT(VARCHAR(10),a.ratechangedate,101) AS [ratechangedate]
        ,a.new_noterate
    FROM MARS_DW.[dbo].[vw_GTMScheduledRateAndPaymentChangesWithAccountNumber_Archive] a
    WHERE a.archivedate = @date
)
SELECT ct.Account' + @cols + N' 
FROM ct
GROUP BY ct.Account;'

--PRINT @query;

EXECUTE sp_executesql @query, N'@date DATETIME', @date = @archivedate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...