2016-10-13 2 views
0

레이저 모양 이름과 날짜가 포함 된 테이블이 있습니다.T-SQL 피벗 쿼리

내 테이블이라고

myBWB_LaserForms

laserform editwhen 
LRAP1.lpw 2009-09-03 16:06:00.000 
CON29R.lpw 2009-10-29 12:35:00.000 
UN1.lpw  2010-03-02 11:38:00.000 
UN244.lpw 2012-04-19 12:14:00.000 
LT3.lpw  2013-01-02 11:00:00.000 
LRAP1.lpw 2007-12-10 15:34:00.000 

는 내가 생산하기 위해 시도하고 상단 예에서 왼쪽과 년 아래로 laserform의 이름을 가진 보고서입니다 2004 년, 2005 년, 2006 년 그리고 각 교차 셀은 해당 연도의 해당 서식 이름에 대한 레코드 수를가집니다.

일반적으로 나는이 꽤 끔찍한 SQL이 실현 그러나 나는

select l.laserform, 
(select count(*) from mybwb_laserforms l1 where l1.laserform=l.laserform and year(editwhen)=2004) AS [2004], 
(select count(*) from mybwb_laserforms l2 where l2.laserform=l.laserform and year(editwhen)=2005) AS [2005], 
(select count(*) from mybwb_laserforms l3 where l3.laserform=l.laserform and year(editwhen)=2006) AS [2006], 
(select count(*) from mybwb_laserforms l4 where l4.laserform=l.laserform and year(editwhen)=2007) AS [2007] 
from mybwb_laserforms l 
group by l.laserform 
order by l.laserform 

뭔가를 할 것이며, 나는 훨씬 더 지능 그것에 대해해야합니다.

필자는 피벗 기능을 사용하는 방법을 배우려하고 있지만 머리를 쓰려고 고심하고 있습니다.

또한 대부분의 예제에서 쿼리 열이 하드 코딩 된 것 같습니다. 피벗이 동적 일 수 있고 고유 한 연도 (editwhen) 값을 가져 와서 쿼리를 수정할 필요가없는 경우 좋을 것입니다. 내년과 그 다음 해.

답변

0

그냥 요약 해주세요.

select laserform, 
sum(case when year(editwhen)=2004 then 1 else 0 end) AS [2004], 
sum(case when year(editwhen)=2005 then 1 else 0 end) AS [2005], 
sum(case when year(editwhen)=2006 then 1 else 0 end) AS [2006], 
sum(case when year(editwhen)=2007 then 1 else 0 end) AS [2007] 
from mybwb_laserforms 
where year(editwhen) between 2004 and 2007 
group by laserform 
order by laserform 

또는 동적

declare @Year int = year(GetDate()); 
declare @Years TABLE ([year] varchar(4)); 
insert into @Years values (@Year-12),(@Year-11),(@Year-10),(@Year-9); 

declare @SQLSums varchar(max) = ''; 
select @SQLSums = @SQLSums +char(13)+', sum(case when year(editwhen)='+[year]+' then 1 else 0 end) AS ['+[year]+']' 
from @Years; 

DECLARE @SQL nvarchar(max) = 'select laserform'+ @SQLSums +' 
from mybwb_laserforms 
group by laserform 
where year(editwhen) between '+cast(@Year-12 as varchar)+' and '+cast(@Year-9 as varchar)+' 
order by laserform'; 

--select @SQL; 
exec (@SQL);