2013-09-05 2 views
0

글쎄, 어제의 질문에서 답한 내용을 사용하려고 애썼고 @AaronBertrand에서 비슷한 유형의 문제에 대한 답변을 제공했습니다. 나는 다음과 같습니다 데이터가 2008 R2피벗 테이블에 데이터 가져 오기

마이크로 소프트 SQL 서버에서 사용하고 있습니다 :

SalesPersonID TransDate Order  DateTotal 
1108   8/2/2013 231.95 7713.8 
1108   8/2/2013 5805.15 7713.8 
1108   8/2/2013 1676.70 7713.8 
1108   8/3/2013 159.95 3635.35 
1108   8/3/2013 468.90 3635.35 
1108   8/3/2013 1160.85 3635.35 
1108   8/3/2013 209.95 3635.35 
1108   8/3/2013 1161.85 3635.35 
1108   8/3/2013 473.85 3635.35 
1108   8/4/2013 149.98 3151.68 
1108   8/4/2013 793.95 3151.68 
1108   8/4/2013 55.00  3151.68 
1108   8/4/2013 198.95 3151.68 
1108   8/4/2013 398.00 3151.68 
1108   8/4/2013 1255.85 3151.68 
1108   8/4/2013 299.95 3151.68 
1108   8/9/2013 223.95 1413.8 
1108   8/9/2013 59.95  1413.8 
1108   8/9/2013 1129.90 1413.8 
1108   8/30/2013 1396.43 1396.43 
1108   8/31/2013 89.95  1735.65 
1108   8/31/2013 495.95 1735.65 
1108   8/31/2013 495.95 1735.65 
1108   8/31/2013 633.85 1735.65 
1108   8/31/2013 19.95  1735.65 
1205   8/3/2013 2389.09 2389.09 

내가 이전 질문 [Here]로부터받은 응답을 사용하여, 나는 완전히하지 않는 것 같아요

다음 SQL ....

SO .....

내가 이런 일을 와서 데이터를 필요로하고 이해 나는 6 월을 선택한 경우 69,

상단에있는 숫자, 나는 8 월을 사용하고 선택한 월의 일이다, 그것은 단지 30

나는 나의 처음이자 마지막 일 날짜를 얻기 위해이 코드를 사용할 것 . 모두가 줄 수있는 모든 도움을

SELECT xhours = number FROM Master..spt_values WHERE type = N'P' and number between 1 and @SelectedMonthDays ORDER BY number 

감사 : 현재 선택된 달의

DECLARE @BeginDate AS VARCHAR(10), @EndDate AS VARCHAR(10), @SelectedMonthDays AS int 
SET @BeginDate='08/15/13' 

-- Last Day of Current Month 
Set @SelectedMonthDays = DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@BeginDate)+1,0))) 

-- Last day Date of Current Month 
SET @EndDate=cast(convert(date,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@BeginDate)+1,0))) as varchar(10)) 

-- Convert input date to the first day Date of current month 
Set @BeginDate = cast(convert(date,DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,@BeginDate),0))) as varchar(10)) 

얻으려면 일,이 코드가 있습니다.

답변

3

이러한 유형의 데이터 변환을 PIVOT이라고합니다.

당신은 당신이 하드 코드 쿼리 수 및 기본 구문이 될 것입니다, 당신은 사전에 원하는 값을 알고있는 경우 : 당신이에 따라 결과를 조정하려는

SELECT salespersonid, 
     COALESCE([1], 0.00) AS [1], 
     COALESCE([2], 0.00) AS [2], 
     COALESCE([3], 0.00) AS [3], 
     COALESCE([4], 0.00) AS [4] 
FROM 
(
    SELECT salespersonid, 
     [order], 
     Datepart(day, transdate) day 
    FROM yourtable 
    WHERE transdate >= '2013-08-01' 
     AND transdate <= '2013-08-31' 
) x 
PIVOT 
(
    Sum([order]) 
    FOR day IN ([1], [2], [3], [4]) 
) p 

그러나 상황 매월 동적 SQL을 사용하여 보려는 날짜 수. Master..spt_values을 사용하여 기존 쿼리를 사용하면 해당 목록을 문자열에 배치해야하는 날짜 목록을 얻을 수 있습니다.

DECLARE @BeginDate AS VARCHAR(10), @EndDate AS VARCHAR(10), @SelectedMonthDays AS int 
SET @BeginDate='08/15/13' 

-- Last Day of Current Month 
Set @SelectedMonthDays = DATEPART(day, DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@BeginDate)+1,0))) 

-- Last day Date of Current Month 
SET @EndDate=cast(convert(date,DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,@BeginDate)+1,0))) as varchar(10)) 

-- Convert input date to the first day Date of current month 
Set @BeginDate = cast(convert(date,DATEADD(s,0,DATEADD(mm, DATEDIFF(m,0,@BeginDate),0))) as varchar(10)) 


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

select @cols = STUFF((SELECT ',' + QUOTENAME(number) 
        from Master..spt_values 
        WHERE type = N'P' 
         and number between 1 and @SelectedMonthDays 
        group by number 
        ORDER BY number 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

select @colsNull = STUFF((SELECT ', coalesce(' + QUOTENAME(number)+', 0.00) as '+QUOTENAME(number) 
        from Master..spt_values 
        WHERE type = N'P' 
         and number between 1 and @SelectedMonthDays 
        group by number 
        ORDER BY number 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 


set @query = 'SELECT SalesPersonID, ' + @colsNull + ' 
      from 
      (
       select SalesPersonID, [Order], 
        datepart(day, TransDate) day 
       from yourtable 
       where TransDate>= '''+convert(varchar(10), @BeginDate, 120)+''' 
        and TransDate<= '''+convert(varchar(10), @EndDate, 120)+''' 
      ) x 
      pivot 
      (
       sum([Order]) 
       for day in (' + @cols + ') 
      ) p ' 


execute sp_executesql @query; 

SQL Fiddle with Demo 참조 : 동적 SQL 코드는 유사합니다. 결과는 다음과 같습니다.

| SALESPERSONID | 1 |  2 |  3 |  4 | 5 | 6 | 7 | 8 |  9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |  30 |  31 | 
|   1108 | 0 | 7713.8 | 3635.35 | 3151.68 | 0 | 0 | 0 | 0 | 1413.8 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1396.43 | 1735.65 | 
|   1205 | 0 |  0 | 2389.09 |  0 | 0 | 0 | 0 | 0 |  0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |  0 |  0 | 
+0

Worked great !! 고맙습니다. 하지만 작은 문제가 하나 있습니다. 산출 된 달러는 소수점 오른쪽에 십진수 4 자리가 있습니다. 나는 이것을 고치려고 노력했는데, 나는 그 코드를 어기는 것 같다. 'SalesPersonID를 선택하십시오. [Order], datepart (day, TransDate) AS day와 같이 SalesPersonID, Cast ([Order]를 10 진수 (6,2)로 선택하십시오.'오류 : 데이터 유형으로 돈을 변환하는 산술 오버플로 오류 숫자. – Jeff

+0

@Jeff 해당 코드가 작동해야합니다 -이 데모보기 - http://sqlfiddle.com/#!3/c03167/16 해당 열의 데이터 유형은 무엇입니까? 당신은 올바른 테이블 구조로 SQL 바이올린을 편집 할 수 있습니까? – Taryn

+0

데모를 확인했는데 내용이 정확합니다. 데이터 유형은 십진수 (6,2)입니다. – Jeff

관련 문제