2014-09-10 1 views
0

UPC, 월 # 및 주 #이 세 개의 기본 열이 포함 된 테이블이 있습니다. (아래 스크린 샷)피벗 함수를 사용하여 SQL Server의 한 열 내에서 여러 값 또는 열을 결합하는 방법은 무엇입니까?

enter image description here

가능 뷰를 만들거나 각각의 고유 한 UPC 하나의 열에 그룹 주 번호가 너무 많은 행을 표시하는 것이있을 것 테이블을 표시하는 것입니다. (이런 예)

enter image description here

내가 그룹화하여 그룹으로 피벗 기능을 사용해야합니까이를 달성하기 위해 SETS?

감사합니다.

+0

STUFF 및 FOR XML을 사용할 수 있습니다. http://www.sqlservercentral.com/articles/comma+separated+list/71700/ –

답변

3

SQL Fiddle

MS SQL 서버 2008 스키마 설정 : 1

검색어 :

DECLARE @TABLE TABLE (RecordID INT, UPC BIGINT, MonthNumberOnPromo INT, WeekNumberOnPromo INT) 
INSERT INTO @TABLE VALUES 
(1 , 2529230005 , 1 , 1) , (2 , 2529230005 , 2 , 6), 
(3 , 2529230005 , 3 , 11) , (4 , 2529230005 , 4 , 15), 
(5 , 2529230005 , 6 , 22) , (6 , 2529230005 , 7 , 27), 
(7 , 2529230005 , 8 , 31) , (8 , 2529230005 , 9 , 35), 
(9 , 2529230007 , 1 , 1) , (10 , 2529230007 , 2 , 6), 
(11 , 2529230007 , 3 , 11) , (12 , 2529230007 , 4 , 15), 
(13 , 2529230007 , 6 , 22) , (14 , 2529230007 , 8 , 31), 
(15 , 2529230007 , 9 , 35) , (16 , 2529230007 , 10 , 38), 
(17 , 2529230007 , 12 , 51) 

SELECT * 
FROM (
    SELECT t.UPC 
      ,LEFT(DATENAME(MONTH , '1900' + RIGHT('00' 
         + CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) AS [Month] 
      ,'Yes' AS Value 
      ,STUFF((SELECT ',' + CAST(WeekNumberOnPromo AS NVARCHAR(10)) 
        FROM @TABLE 
        WHERE t.UPC = UPC 
        FOR XML PATH(''),TYPE) 
        .value('.','NVARCHAR(MAX)'),1,1,'') AS [Week_List] 
    FROM @TABLE t 
    GROUP BY t.UPC 
      ,LEFT(DATENAME(MONTH , '1900' + RIGHT('00' 
         + CAST(t.MonthNumberOnPromo AS NVARCHAR(2)),2) + '01') , 3) 
    )t 
PIVOT (MAX(Value) 
     FOR [Month] 
     IN ([JAN],[FEB],[MAR],[APR],[MAY],[JUN],[JUL],[AUG],[SEP],[OCT],[NOV],[DEC]) 
    )p 

Results :

|  UPC |    WEEK_LIST | JAN | FEB | MAR | APR | MAY | JUN | JUL | AUG | SEP | OCT | NOV | DEC | 
|------------|--------------------------|-----|-----|-----|-----|--------|-----|--------|-----|-----|--------|--------|--------| 
| 2529230005 | 1,6,11,15,22,27,31,35 | Yes | Yes | Yes | Yes | (null) | Yes | Yes | Yes | Yes | (null) | (null) | (null) | 
| 2529230007 | 1,6,11,15,22,31,35,38,51 | Yes | Yes | Yes | Yes | (null) | Yes | (null) | Yes | Yes | Yes | (null) | Yes | 
+0

감사합니다. M.Ali. '19000101'의 의미를 알 수 있습니까? – user3486647

+0

당신은 정수 값으로 저장된 달이 있기 때문에 Case 문을 사용할 수도 있었지만 그 달 번호를 모의 날짜 값으로 변환 한 다음'DATENAME()'함수를 사용하여 그 날짜 값에서 월 이름을 가져 왔습니다. –

+0

또한 자세히 보겠습니다. 나는 정수형 월을 처음으로 12 개월로 변환하면 19000101에 12 개월을 추가하고 19010101의 날짜 값에서 1 월을 반환하는 방식을 변경했습니다. –

관련 문제