2012-10-19 5 views
1

이것은 동적 피벗 팅에서의 첫 번째 시도이며 조금 갇혀 있습니다!동적 SQL 피벗 - null 제거

나는 두 개의 테이블을 가지고 있는데, 하나는 주식 항목을 보유하고 다른 하나는 다른 웹 사이트 (소스)에 대한 주식 항목의 다른 가격을 보유합니다. 다른 사이트를 가질 가능성이 있으므로 쿼리는 동적이어야합니다.

문제는 내가 결과에서 nulls을 제거 할 수 없으며 누군가가 도울 수 있기를 바랬습니다.

결과는 현재 다음과 같이 다음과 같이

ID site-site1 site-site2 site-site3 
1  null   1.99   2.99 
2  12.99   null   10.00 
3  1.50   null   2.00 

쿼리는 다음과 같습니다 어떤 도움을 크게 감상 할 수

DECLARE @sources nvarchar(max) 

SELECT @sources = 
STUFF((SELECT DISTINCT ',[' + 
CASE 
WHEN ip.[Source] is null or ip.[Source] = '' THEN 'Default' 
ELSE ip.[Source] 
END 
+ ' - ' + 
CASE 
WHEN ip.secondSource is null or ip.secondSource = '' THEN 'Default' 
ELSE ip.secondSource 
END 
+ ']' 
    FROM itemprice ip 
    for XML PATH('') 
), 1, 1, '') 

DECLARE @SQL nvarchar(MAX) 
SELECT @SQL = N' 
SELECT * 
FROM 
(
SELECT 
s.id, 
[Source] = CASE 
       WHEN ip.[Source] is null or ip.[Source] = '''' THEN ''Default'' 
     ELSE ip.[Source] 
     END + '' - '' + 
CASE WHEN ip.secondSource is null or ip.secondSource = '''' THEN ''Default'' 
ELSE ip.secondSource 
END, 
    SalePrice = isnull(ip.SalePrice, 0) 
    FROM stock s 
    LEFT OUTER JOIN itemprice ip on ip.id = s.id 
) data 
PIVOT 
( 
    MAX(SalePrice) for [Source] IN (' + @sources + ') 
) as PivotTable 
ORDER BY PivotTable.id' 
exec sp_executesql @sql 

는 각 포장만큼 간단하지 않다 것처럼 나타나는 @ 원본 항목을 ISNULL로 지정하십시오.

감사합니다.

+0

null을 제거하면 무엇을 의미합니까? 너는 무엇을 원하는거야? – podiluska

+0

죄송합니다. 분명히해야합니다.이 경우에는 0s –

답변

2

불행히도 개별 피벗 된 열을 각각 ISNULL해야합니다. 그 중 하나 또는 귀하의 data 하위 쿼리 전체 매트릭스를 생성하고 ISNULL을 수행하는 데 조인.

피벗 된 열에서 ISNULL을 사용하여 NULL을 0으로 바꿉니다.

DECLARE @sources nvarchar(max), @Selectlist nvarchar(max) 

SELECT @sources = 
STUFF((SELECT DISTINCT ',[' + 
CASE 
WHEN ip.[Source] is null or ip.[Source] = '' THEN 'Default' 
ELSE ip.[Source] 
END 
+ ' - ' + 
CASE 
WHEN ip.secondSource is null or ip.secondSource = '' THEN 'Default' 
ELSE ip.secondSource 
END 
+ ']' 
    FROM itemprice ip 
    for XML PATH('') 
), 1, 1, '') 

SELECT @Selectlist = 
STUFF((SELECT DISTINCT ',ISNULL([' + 
CASE 
WHEN ip.[Source] is null or ip.[Source] = '' THEN 'Default' 
ELSE ip.[Source] 
END 
+ ' - ' + 
CASE 
WHEN ip.secondSource is null or ip.secondSource = '' THEN 'Default' 
ELSE ip.secondSource 
END 
+ '],0) [' + 
CASE 
WHEN ip.[Source] is null or ip.[Source] = '' THEN 'Default' 
ELSE ip.[Source] 
END 
+ ' - ' + 
CASE 
WHEN ip.secondSource is null or ip.secondSource = '' THEN 'Default' 
ELSE ip.secondSource 
END 
+ ']' 
    FROM itemprice ip 
    for XML PATH('') 
), 1, 1, '') 

DECLARE @SQL nvarchar(MAX) 
SELECT @SQL = N' 
SELECT ID, ' + @Selectlist + ' 
FROM 
(
SELECT 
s.id, 
[Source] = CASE 
       WHEN ip.[Source] is null or ip.[Source] = '''' THEN ''Default'' 
     ELSE ip.[Source] 
     END + '' - '' + 
CASE WHEN ip.secondSource is null or ip.secondSource = '''' THEN ''Default'' 
ELSE ip.secondSource 
END, 
    SalePrice = isnull(ip.SalePrice, 0) 
    FROM stock s 
    LEFT OUTER JOIN itemprice ip on ip.id = s.id 
) data 
PIVOT 
( 
    MAX(SalePrice) for [Source] IN (' + @sources + ') 
) as PivotTable 
ORDER BY PivotTable.id' 
exec sp_executesql @sql 
+0

+1이 필요합니다. 그러나 ''[ '+ column +'] '대신'QUOTENAME (Column) '을 사용하는 것이 더 좋습니다. 동적으로 생성 된 컬럼 중 하나가'['또는']'를 포함하면,'QUOTENAME'은 이것을 벗어나 출력이 선택을위한 유효한 컬럼인지 확인하는 것이 가장 좋습니다. – GarethD

+0

동적으로 생성 된 열 중 대괄호가 포함되어 있으면 바꾸기가 실패 할 것이라고 생각하지만 ... 아마도 피벗 및 선택 항목에 대한 열 목록을 별도로 생성하면보다 강력한 솔루션이 될 것입니다. – GarethD

+0

피벗 열 목록 ** IS ** 기본 선택 열 목록입니다. 그리고 OP가 작동하는 솔루션이라면'[] '을 포함하지 않는 열 이름에 대해 내기하지 않을 것입니다. 하지만 네, 저는 개인적으로'QUOTENAME'을 사용합니다. – RichardTheKiwi