2014-04-21 2 views
1

다음 쿼리는 기본적으로 피벗 테이블에서 3 개의 테이블을 결합하여 StaffReference 코드, StaffCode 및 헤더를 WipAmount로 표시합니다. 이 코드는 기본적으로 올바르게 실행되지만 모든 필드가 NULL 인 열은 표시하지 않으려 고합니다. 열이 NULL 값의 전체 인 경우피벗 테이블에 Null 값이있는 열 억제

-------aea-----fum  
ejh--10.00----6.00 
fum---5.00----null 
aea---null-----7.00 

기본적으로,이 보고서를 현재 출력 내가 무엇을 필요

--------ejh -----aea-----fum  
ejh----null----10.00----6.00 
fum---null-----5.00-----null 
aea---null-----null-----7.00 

예를 무엇

예를 읽기 쉽도록합니다 , 내가 가지고있는 쿼리는 다음과 같다. 이 쿼리는 올바르게 작동하고 모든 데이터를 표시합니다.

DECLARE @sql varchar(MAX) 
DECLARE @columns TABLE (COL varchar(50)) 
declare @columnscsv varchar(MAX) 

insert into @columns 
select distinct StaffCode from tblStaff 

select @columnscsv = COALESCE(@columnscsv + '],[','') + COL from @columns 
set @columnscsv = '[' + @columnscsv + ']' 

SET @sql = 'Select StaffReference ' + @columnscsv + ' 
FROM(SELECT ocr.staffcode, em.StaffReference, WipAmount FROM tblTranWip w 
Join tblengagement e on e.contindex = w.contindex 
Join tblstaff ocr on ocr.staffindex = e.clientpartner 
Join tblstaff em on em.staffindex = e.clientmanager 
WHERE (w.WIPDate>={ts ''2013-04-01 00:00:00''} 
AND w.WIPDate<{ts ''2014-03-31 00:00:01''}) 
AND w.TransTypeIndex=1 AND w.ContIndex<900000 
) as a 
PIVOT (SUM(WipAmount) for StaffCode in (' + @columnscsv + ')) AS PVT 
Order by StaffReference' 

EXEC (@sql) 
+0

쿼리를 테스트 할 수 있도록 일부 행이있는 샘플 테이블을 넣을 수 있습니까? –

+0

예 오늘 밤 샘플 표를 추가하겠습니다. 미안 나는 도시에 있었고, 되돌아 갈 수 없었다. 아직 아이디어 없으세요? – andres

답변

1

isnull을 사용하면 null 값을 없애고 대신 원하는 값을 지정할 수 있습니다. 아래 그냥 공백을 사용하지만 숫자 값으로 0을 반환 할 수 있습니다. 요청 해명 위해 편집

SELECT ISNULL(ocr.staffcode, ''), isnull(em.StaffReference, ''), isnull(WipAmount, '') FROM tblTranWip 

- 당신이 null 값을 제거 할 수 있습니다 그래서

ISNULL 아래 주석을 참조하지만 그 값을 대체합니다.

사용중인 코드가 무엇을하는지 설명하겠습니다. 먼저 동적 SQL을 사용하고 이것이 유용 할 때 몇 가지 보안 함의가있을 수 있습니다. Tthis link] 1은 동적 SQL의 저주와 축복에 대한 내가 가장 좋아하는 설명 중 하나입니다. 이전에 사용하지 않았다면 꼭 읽는 것이 좋습니다.

이 코드는 테이블에서 식별 한 열을 쉼표로 구분 된 문자열로 채우고 나중에 select 문에서 사용합니다.

DECLARE @sql varchar(MAX) 
DECLARE @columns TABLE (COL varchar(50)) 
declare @columnscsv varchar(MAX) 

insert into @columns 
select distinct StaffCode from tblStaff 

select @columnscsv = COALESCE(@columnscsv + '],[','') + COL from @columns 
set @columnscsv = '[' + @columnscsv + ']' 

다음은이 열의 설정입니다. 당신은 피벗 기능을 사용할 때 당신은 당신이에 피벗 할 열을 지정해야하고 여기에 동적 SQL을 사용하여 당신은 그들이 변수가 될 수있다 : 당신이 정적으로 그 값을 가지고 있기 때문에

SET @sql = 'Select StaffReference ' + @columnscsv + ' 

그러나 내가 알았어 야하는 것은 당신도 내가 여기에 나열됩니다 내면의 쿼리를 실행하기 전에 설정, 즉 그들이 null을 반환하는 경우에 관계없이 그 열 이름을 모두 사용하는 것을 제한 : 그래서

SELECT ocr.staffcode, em.StaffReference, WipAmount FROM tblTranWip w 
Join tblengagement e on e.contindex = w.contindex 
Join tblstaff ocr on ocr.staffindex = e.clientpartner 
Join tblstaff em on em.staffindex = e.clientmanager 
WHERE (w.WIPDate>={ts ''2013-04-01 00:00:00''} 
AND w.WIPDate<{ts ''2014-03-31 00:00:01''}) 
AND w.TransTypeIndex=1 AND w.ContIndex<900000 

, 당신이 진정으로 원한다면 것을 다음과 null 열을 제외하면 값이 유지되는 열만 사용하여 @columns 테이블을 동적으로 채울 수 있기를 원합니다. s, 당신은 내가 위에 붙여 넣은 초기 내부 쿼리를 사용하여 식별 할 수 있어야합니다. 그 내부 구문으로부터 컬럼 값을 얻지 못한다면 그 컬럼이 어디에서 오는 것인지 이해하기 위해서는 더 많은 정보가 필요합니다.

+0

오늘 밤에 이것을 시험 할 것입니다. 저는 제로와 같은 것을 표시하고 싶지 않습니다. 기본적으로 열 아래로 모두 null 인 모든 열을 없애고 싶습니다.이렇게하면 보고서를 읽는 사람이 의미있는 데이터가있는 열을 보려고 영원히 수평 스크롤 할 필요가 없습니다. – andres

+0

오케이 그래서 처음 샘플 출력을 보지 못했습니다. 이 솔루션은 null 값을 제거하여 실제로 null 값의 전체 열을 억제하지는 않습니다. 먼저 동적으로 열을 작성하는 경우 먼저 열을 작성하기 전에 값이 있는지 확인해야합니다. 둘째, 가장 깊은 쿼리에서 null 행이 있는지 확인 했습니까? null 열이 표시되는 것을 볼 수 있기 때문입니다. 금액에 null 값이있는 행이 있으면 having 절을 사용하여이를 필터링 할 수 있습니다. ' – rhealitycheck

+0

설명해 주셔서 감사합니다. 코드에서 Null 값을 확인해야합니다. 필자는 피어 테이블을 만드는 방법을 모든 곳에서 온라인으로 읽음으로써이 쿼리를 만들었지 만 코드가 select 문 및 피벗 외부에서 어떻게 작동하는지 완전히 이해하지 못합니다. – andres

관련 문제