2012-11-26 3 views
1

SQL Server 2005에서 아래에 언급 된 결과를 가져 오는 다음 쿼리가 있습니다.피벗 쿼리 - SQL Server 2005

select Distinct(date),id, 
      sum(convert(float,Gross)), 
      count(*) as no from Daily 
    group by date,id 
    order by date desc 

Date      id   Gross   Count 
2012-11-25 00:00:00.000 Client id1 1232.6140752 12 
2012-11-25 00:00:00.000 Client id2 1183.75621528 88 
2012-11-26 00:00:00.000 Client id3 4561.459086 67 
2012-11-26 00:00:00.000 Client id4 6781.15660608 440 

이제 어떻게 결과를 다음 형식으로 가져 옵니까? 이 REQD 두 가지 방법이 있습니다

id   Date1 Date2 Date3 Date4 Date5 Date6 Date7 
Client id1 Gross  
Client id2 Gross 
Client id3 Gross 
+0

를 참조하십시오 코드는 다음과 유사합니다? – Taryn

+0

날짜 값 ... 하루 종일 모든 일이 테이블에 표시됩니다 ... 그래서 매일 우리는 총액이 – Gallop

답변

2

도와주세요하는 피벗 쿼리처럼 보이는 당신은 정적 버전 중 하나를 PIVOT을 할 수있는 위치를 하드 코딩 날짜 값 또는 생성하는 동적 버전의 모든 실행시의 일자의리스트

정적 버전 :

당신이 날짜의 수를 제한 한 경우 쿼리가이 유사합니다.

이 버전은 실행시 날짜의 목록을 얻을 수있는 동적 SQL을 생성합니다

select id, [yourDate1], [yourDate2], [yourDate3] 
from 
(
    select date, id, cast(gross as float) as gross 
    from Daily 
) src 
pivot 
(
    sum(gross) 
    for date in ([yourDate1], [yourDate2], [yourDate3]) 
) piv; 

SQL Fiddle with Demo

동적 버전을 참조하십시오.

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(date) 
        from Daily 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT id, ' + @cols + ' from 
      (
       select date, id, cast(gross as float) as gross 
       from Daily 
      ) src 
      pivot 
      (
       sum(gross) 
       for date in (' + @cols + ') 
      ) p ' 

execute(@query) 

당신이 원하는 마십시오`Date1`,`Date2` 또는 열이 날짜 값을 가지고 있어야 말한다하는 열을 SQL Fiddle with Demo

+0

+1 너무 느립니다. –

+0

메시지 8117, 레벨 16, 상태 1, 라인 1 피연산자 데이터 형식 varchar는 sum 연산자에 유효하지 않습니다. 동적 쿼리가 사용되는 경우. – Gallop

+0

@Moonwalk'gross' 필드가'varchar' 인 경우 내부 쿼리에서'convert'를 수행해야합니다. 내 편집 참조 – Taryn

0
WITH a AS 
(
    SELECT [Id], [Gross] 
    , [DateRank] = DENSE_RANK() OVER (ORDER BY [Date]) 
    FROM [Daily] 
) 
SELECT * 
FROM a PIVOT 
(
    SUM([Gross]) 
    FOR [DateRank] IN ([1], [2], [3], [4], [5], [6], [7]) 
) b