복붙노트

[SQL] 열로 날짜를 동적으로 회동하는 방법

SQL

열로 날짜를 동적으로 회동하는 방법

나는 제품 ID의와 이름, 특정 날짜에 이러한 제품의 주식을 가진 다른 테이블과 테이블이 있습니다. 이러한 항목 1로 2014년 1월 1일 6 주식과 2014년 2월 1일 8 주식을 가지고 있었다. 나는 그것이 세포에서 사용할 수있는 모든 달의 날짜와 재고를 보여, 달력처럼 보이도록 저장 프로 시저에 다음을 표시하기 위해 노력하고있어. 이 보여줄 수있는 가장 좋은 방법은 무엇입니까?

예를 들면 :

Name  | 1-1-2014 | 2-1-2014 | 3-1-2014 | 4-1-2014
Item1 |     6    |     8    |          |    6
Item2 |          |     2    |     1    |

원래 테이블 - 이름

 ID |   Name 
  1 |  Item1
  2 |  Item2

원래 테이블 - Stockdates

 ID | NameID  | Stock |    Date 
  1 |    1    |   8   |  2-1-2014    
  2 |    2    |   2   |  4-1-2014 

해결법

  1. ==============================

    1.다음은 샘플 테이블입니다

    다음은 샘플 테이블입니다

    SELECT * INTO #Names
    FROM
    (
    SELECT 1 ID,'ITEM1' NAME 
    UNION ALL
    SELECT 2 ID,'ITEM2' NAME 
    )TAB
    
    SELECT * INTO #Stockdates
    FROM
    (      
    SELECT 1 ID,1 NAMEID,8 STOCK,'2-1-2014 ' [DATE]
    UNION ALL
    SELECT 2 ID,2 NAMEID,2 STOCK,'4-1-2014 ' [DATE]
    )TAB
    

    (가) 임시 테이블에 데이터를 결합 넣어

    SELECT N.NAME,S.[DATE],S.STOCK 
    INTO #TABLE
    FROM #NAMES N
    JOIN #Stockdates S ON N.ID=S.NAMEID
    

    피벗에 대한 열을 받기

    DECLARE @cols NVARCHAR (MAX)
    
    SELECT @cols = COALESCE (@cols + ',[' + CONVERT(NVARCHAR, [DATE], 106) + ']', 
                   '[' + CONVERT(NVARCHAR, [DATE], 106) + ']')
                   FROM    (SELECT DISTINCT [DATE] FROM #TABLE) PV  
                   ORDER BY [DATE]
    

    이제 피벗

    DECLARE @query NVARCHAR(MAX)
    SET @query = '           
                  SELECT * FROM 
                 (
                     SELECT * FROM #TABLE
                 ) x
                 PIVOT 
                 (
                     SUM(STOCK)
                     FOR [DATE] IN (' + @cols + ')
                ) p      
    
                '     
    EXEC SP_EXECUTESQL @query
    

    그리고 당신의 결과는 여기

  2. ==============================

    2.1 단계 - 갭 채우기 (아마도 필요하지 않음)

    1 단계 - 갭 채우기 (아마도 필요하지 않음)

    당신의 주식 테이블은 모든 제품에 대한 매일에서 주식을 포함하지 않는 경우에 당신은 다른 곳에서 한 달에 모든 날짜를 얻을 수 있습니다. 당신은 재귀 CTE로를 생성 할 수 있습니다 (변수 선언이 생략)

    with dates as
    (
       select @startdate as [date]
       union ALL
       select   [date] + 1 
       from dates
       where    [date] < @enddate
    )
    select  @strDays = COALESCE(@strDays + ', ['+ convert(varchar(8), [date],112) + ']', '['+ convert(varchar(8), [date],112) + ']') 
    from    dates;
    

    당신은 원하는 날짜 형식을 사용할 수 있지만 모든 쿼리에 유지하는 것이 중요합니다.

    2 단계 - 일반적인 형태의 데이터를 통합 할 수 있습니다. 당신은 임시 테이블에 저장하도록 선택할 수 있습니다 또는 당신은 CTE를 다시 사용하고 3 단계로이 단계를 결합 할 수 있습니다.

    이 같은 표를 얻을 수 있도록 제품 (위에서) 날짜 (전체)과 주식으로 가입 (왼쪽) :

    date
    product_id    
    items
    

    재고가없는 제품과 날짜를 들어 당신은 트릭을 할 것입니다 0 ISNULL을 표시합니다. 확인 날짜 열은 위의 CTE과 동일한 형식으로 VARCHAR로 변환됩니다.

    3 단계 - 피벗 동적 쿼리 날짜 열하여 (단계 2에서 수득) 테이블.

    나는 지금 당신에게 더 많은 세부 사항이 아닌를 제공 할 수 있습니다. 당신은 다른 응답 비슷한 것을 볼 수 있습니다 : 다른 컬럼에 걸쳐 고유 값

  3. from https://stackoverflow.com/questions/27422109/how-to-pivot-dynamically-with-date-as-column by cc-by-sa and MIT license