Member 14525600 Ответов: 1

Как заменить нулевые значения пустой строкой в динамическом сводном запросе


У меня есть этот динамический запрос:

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;


Что я уже пробовал:

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

<pre>> Msg 207, Level 16, State 1, Line 10  
> Invalid column name 'ratechangedate'.
>
> Msg 207, Level 16, State 1, Line 12  
> Invalid column name 'ratechangedate'.
>
> Msg 207, Level 16, State 1, Line 14  
> Invalid column name 'ratechangedate'.  

> ...... and so on for every other "line" up to a value of 34 .......


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

1 Ответов

Рейтинг:
9

phil.o

Я думаю, что вы ищете COALESCE (Transact-SQL)[^] функция.

Например:

COALESCE(CONVERT(VARCHAR(10), a.ratechangedate, 101), '')
COALESCE(a.new_noterate, '')

Обратите внимание, что я определил имена столбцов с табличным псевдонимом "а", так как реальная проблема здесь заключается в том, что движок не распознает имена столбцов.


Member 14525600

Не могли бы вы дать более подробный ответ?

Maciej Los

Перейдите по ссылке, и там вы найдете пример использования этой функции.

Maciej Los

Коротко И По Существу!

phil.o

Спасибо :)

Member 14525600

Опять же поможет более подробный ответ

phil.o

Я не знаю, какие поля могут быть нулевыми и нуждаются в объединении, поэтому мне будет трудно привести осмысленный пример.
Для общих примеров ссылка, которую я предоставил, содержит все, что вам нужно знать, чтобы использовать эту функцию; вы просто должны использовать ее там, где вам нужно.
Если у вас есть более точный вопрос о COALESCE после прочтения его документации, мы будем рады ответить на него.
Edit: пожалуйста, смотрите мой обновленный ответ для примеров из того, что вы пробовали.