2014-01-29 7 views
1

배경 정보 큰 테이블 400M + 행이 매일 바뀝니다 (1 일 데이터는 새 데이터가 삭제됩니다) 테이블은 ' 하루 '필드에 31 칸막이가 있습니다.동적 7 일 행을 t-sql이있는 열로 변환하는 방법

Postcode, Deliverypoint, 7dayAverage, Day1,day2,Day3,Day4,Day5,Day6,Day7 
SN1 1BG  A1    2   0 1 2 1 3 4 0 

내가 쉽게 7 일의 기간에 대한 데이터를 추출 할 수 있습니다 : 나는 형식의 데이터 7 일을 꺼내 필요

ID, Postcode, DeliveryPoint, Quantity, Day, Month 
1 SN1 1BG A1    6  29 1 
2 SN1 1BG A1    1  28 1 
3 SN1 1BG A2    2  27 1 
4 SN1 1BG A1    3  28 1 
5 SN2 1AQ B1    1  29 12 
6 SN1 1BG A1    2  26 12 

: 테이블의 각 행은 다음과 유사한 데이터가 위에 표시된 것처럼 원주 형 버전을 만들어야합니다. #days은 7 일의 기간에 하루 번호를 가지고

select postcode,deliverypoint, 
sum (case day when 23 then quantity else 0 end) as day1, 
sum (case day when 24 then quantity else 0 end) as day2, 
sum(case day when 25 then quantity else 0 end) as day3, 
sum(case day when 26 then quantity else 0 end) as day4, 
sum(case day when 27 then quantity else 0 end) as day5, 
sum(case day when 28 then quantity else 0 end) as day6, 
sum(case day when 29 then quantity else 0 end) as day7, 
sum(quantity)*1.0/@daysinweek as wkavg 
into #allweekdp 
from maintable dp with (nolock) 
where day in (select day from #days) 
group by postcode,deliverypoint 

:

나는 이런 식으로 뭔가가있다.

하지만 알 수 있듯이 하루의 숫자를 쿼리에 하드 코딩하여 임시 테이블에서 꺼내려고하지만 일을하는 방법을 볼 수 없습니다 (배열은 여기에 완벽)

아니면 완전히 잘못된 방식으로 진행됩니까?

친절 감사

스티브

답변

0

만약 내가 제대로 이해하고는, 내가 무엇을 할 것입니다 것은 :

  1. 이 날짜 값으로 날짜와 달에 열을 변환,
  2. 이의 첫날을 받기 각 날짜의 주중 주간 (1-7) 및
  3. 주의 첫 번째 날까지 데이터 및 그룹 피벗

는 여기를 참조하십시오 utexaspunk 제안으로 sqlfiddle

0

는, 피벗 갈 수있는 방법이 될 수 있습니다. 필자는 피벗에 익숙하지 않았고 수동으로 피벗하는 것을 선호했기 때문에 모든 모양을 제어하므로 문제를 해결하기 위해 스크립트를 수행 한 방법과 비슷한 솔루션을 사용하고 있습니다. 내 방식과 utexspunk의 성능이 어떻게 비교 될지 전혀 모르겠습니다.

Declare @Min_Day Integer = Select MIN(day) as Min_Day From #days; 

With Day_Coding_CTE as (
Select Distinct day 
    , day - @Min_Day + 1 as Day_Label 

From #days 
) 

, Non_Columnar_CTE as (
Select dp.postcode 
    , dp.deliverypoint 
    , d.day 
    , c.Day_Label 
    , SUM(quantity) as Quantity 

From maintable dp with (nolock) 
    Left Outer Join #days d 
     on dp.day = d.day --It also seems like you'll need more criteria here, but you'll have to figure out what those should be 
    Left Outer Join Day_Coding_CTE c 
     on d.day = c.day 
) 

Select postcode 
    , deliverypoint 
    , SUM(Case 
     When Day_Label = 1 
      Then Quantity 
      Else 0 
     End) as Day1 
    , SUM(Case 
     When Day_Label = 2 
      Then Quantity 
      Else 0 
     End) as Day2 
    , SUM(Case 
     When Day_Label = 3 
      Then Quantity 
      Else 0 
     End) as Day3 
    , SUM(Case 
     When Day_Label = 4 
      Then Quantity 
      Else 0 
     End) as Day4 
    , SUM(Case 
     When Day_Label = 5 
      Then Quantity 
      Else 0 
     End) as Day5 
    , SUM(Case 
     When Day_Label = 6 
      Then Quantity 
      Else 0 
     End) as Day6 
    , SUM(Case 
     When Day_Label = 7 
      Then Quantity 
      Else 0 
     End) as Day7 
    , SUM(Quantity)/@daysinweek as wkavg 

From Non_Columnar_CTE 

Group by postcode 
    deliverypoint 
관련 문제