2015-07-31 2 views
1

Я делаю динамический поворот, подобный этим, я хотел заменить значения Null в полях 0 после поворота. Не знаю, как я могу это достичь. Вот мой запрос.Обработка нулевых значений в динамических полях поворота

DECLARE @cols AS NVARCHAR(MAX); 
 
DECLARE @query AS NVARCHAR(MAX); 
 
DECLARE @users TABLE (
 
\t userId UNIQUEIDENTIFIER 
 
\t ,NAME VARCHAR(500) 
 
\t); 
 

 

 
INSERT INTO @users 
 
SELECT u.id 
 
\t ,u.firstname + space(1) + u.lastname NAME 
 
FROM users u 
 
INNER JOIN userparametervalues upv ON u.id = upv.userid 
 
INNER JOIN UserPermissions up ON u.id = up.userid 
 
\t AND up.PermissionId IN (
 
\t \t '34FDF821-E3FF-43B2-AA90-0126BF5FAD56' 
 
\t \t ,'CFC3076F-0BED-4A41-BD1D-0240C4535132' 
 
\t \t) 
 
\t AND upv.parameterid = '137696EA-6B68-42E8-A020-2FA5A833F34E' 
 
INNER JOIN users AS u1 ON upv.value = u1.id 
 
\t AND u1.UserName IN (
 
\t \t 'IN\libin.jose' 
 
\t \t ,'IN\Pallabi.P' 
 
\t \t) 
 

 
UNION 
 

 
SELECT users.id id 
 
\t ,users.firstname + space(1) + users.lastname NAME 
 
FROM users 
 
WHERE UserName IN (
 
\t \t 'IN\libin.jose' 
 
\t \t ,'IN\Pallabi.P' 
 
\t \t) 
 

 

 
SELECT @cols = STUFF((
 
\t \t \t SELECT DISTINCT ',' + QUOTENAME(NAME) 
 
\t \t \t FROM @users 
 
\t \t \t FOR XML PATH('') 
 
\t \t \t \t ,TYPE 
 
\t \t \t).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 
 
SELECT @query = ' 
 

 
SELECT * 
 
FROM 
 
(
 
    select LoanPrograms.Name, (case when UserParameterValues.value is null then ''X'' else ''√'' end) as K ,(users.FirstName + space(1)+users.LastName ) L from LoanPrograms 
 
\t left join UserParameterValues on LoanPrograms.id = UserParameterValues.ValueId and ParameterId = ''CD1DB446-75EF-4887-86ED-4313CCE6D2F1'' 
 
\t \t left join users on UserParameterValues.UserId = Users.Id \t 
 

 
) AS t 
 
PIVOT 
 
(
 
MAX(k) 
 
    FOR L IN(' + @cols + ')' + ') AS p ; '; 
 

 
EXECUTE (@query);

Я получаю результат, как это.

Name \t         Akansha a \t Lia Jose \t Libin \t Pallabi a 
 
-----------------      ---------- --------- -------- ------ 
 
CONF 10 YEAR FIXED \t     NULL  \t NULL \t  NULL \t Y 
 
CONF 10 YR 105       \t NULL \t  NULL \t  NULL \t NULL 
 
CONF 10 YR 125 \t       NULL \t  Y \t   NULL \t NULL 
 
CONF 10 YR LPMI \t       Y \t  NULL \t  NULL \t NULL 
 
CONF 10/1 LIBOR ARM     \t NULL \t  NULL \t  NULL \t NULL

Я хотел бы заменить все нулевые значения на 0.

ответ

1

Вы должны использовать функцию ISNULL в окончательном SELECT от PIVOT. Например, вы можете создать список столбцов, как это:

SELECT @SELECTEDcols = STUFF((
      SELECT DISTINCT ',ISNULL([' + NAME + '], 0) AS [' + NAME + ']' 
      FROM @users 
      FOR XML PATH('') 
       ,TYPE 
      ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 

и заменить * в окончательном SELECT заявлении с ним.

SELECT @query = ' 

SELECT' + @SELECTEDcols + ' 
FROM 
(
    select LoanPrograms.Name, (case when UserParameterValues.value is null then ''X'' else ''√'' end) as K ,(users.FirstName + space(1)+users.LastName ) L from LoanPrograms 
    left join UserParameterValues on LoanPrograms.id = UserParameterValues.ValueId and ParameterId = ''CD1DB446-75EF-4887-86ED-4313CCE6D2F1'' 
     left join users on UserParameterValues.UserId = Users.Id  

) AS t 
PIVOT 
(
MAX(k) 
    FOR L IN(' + @cols + ')' + ') AS p ; '; 
0

SELECT @SELECTEDcols = STUFF((
 
      SELECT DISTINCT ',ISNULL([' + NAME + '], 0) AS [' +NAME + ']' 
 
      FROM @users 
 
      FOR XML PATH('') 
 
       ,TYPE 
 
      ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''); 
 

 

 
SELECT @query = ' 
 

 
SELECT' + @SELECTEDcols + ' 
 
FROM 
 
(
 
    select LoanPrograms.Name, (case when UserParameterValues.value is null then ''X'' else ''√'' end) as K ,(users.FirstName + space(1)+users.LastName ) L from LoanPrograms 
 
    left join UserParameterValues on LoanPrograms.id = UserParameterValues.ValueId and ParameterId = ''CD1DB446-75EF-4887-86ED-4313CCE6D2F1'' 
 
     left join users on UserParameterValues.UserId = Users.Id  
 

 
) AS t 
 
PIVOT 
 
(
 
MAX(k) 
 
    FOR L IN(' + @cols + ')' + ') AS p ; ';

Смежные вопросы