2013-05-28 5 views
1

나는 두 개의 테이블 tempUserstempItems을 가지고 있습니다. 이 두 테이블에는 일대 다 관계가 있습니다. 나는이 두 테이블 조인 내부를 사용할 때피봇과 쉼표로 구분 된 값

는 결과는 다음과 같습니다

user | Category | Date 
_______________________ 
Jack | Shoes | 01/01/2011 
Jack | Tie  |02/01/2011 
Jack | Glass |03/03/2011 
Peggy | Shoe  | 02/02/2012 
Peggy | Skirt | 02/12/2013 

내가 대신과 같은 결과 같은 것 :

User | Category1 | Category2 | Category3 | Dates 
------------------------------------------------- 
Jack | Shoes  | Tie  | Glass  | 01/01/2011,02/01/2011,03/03/2011 
Peggy | Shoe  | Skirt  | ....  | 02/02/2012,02/12/2013 

당신에게

+0

이상 3 개 종류가있을 수 있습니까? – sgeddes

+0

예, 3 개 이상의 카테고리가있을 수 있습니다. 나는 그 부분을 알아 냈다. 여기에 그 링크 http://stackoverflow.com/questions/16737552/sql-server-2008-row-to-column/16738652#16738652 이제 다른 필드 날짜를 쉼표로 구분 된 값으로 표시하고 싶습니다. – WorkInProgress

답변

2
감사

사용해보기 -

검색어 :

IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL 
    DROP TABLE #temp 

CREATE TABLE #temp 
(
     [user] VARCHAR(10) 
     , Category VARCHAR(10) 
     , [Date] DATETIME 
) 

INSERT INTO #temp ([user], Category, [Date]) 
VALUES 
    ('Jack', 'Shoes', '20110101'), 
    ('Jack', 'Tie', '20110102'), 
    ('Jack', 'Glass', '20110303'), 
    ('Peggy', 'Shoe', '20120202'), 
    ('Peggy', 'Skirt', '20131202') 

DECLARE @Columns NVARCHAR(MAX) 

SELECT @Columns = STUFF((
    SELECT DISTINCT 
     ',[' + 'Category' + CAST(
     ROW_NUMBER() OVER (PARTITION BY t.[user] ORDER BY (SELECT 1)) AS VARCHAR(3)) + ']' 
    FROM #temp t 
    FOR XML PATH (''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '') 

DECLARE @SQL NVARCHAR(MAX) 
SELECT @SQL = ' 
SELECT [user], ' + @Columns + ', Dates 
FROM (
    SELECT 
      t.[user] 
     , t.category 
     , rn = ''Category'' + CAST(ROW_NUMBER() OVER (PARTITION BY t.[user] ORDER BY (SELECT 1)) AS VARCHAR(3)) 
     , Dates = STUFF((
       SELECT '', '' + CONVERT(VARCHAR(10), t2.[Date], 103) 
       FROM #temp t2 
       WHERE t2.[user] = t.[user] 
       FOR XML PATH(''''), TYPE).value(''.'', ''VARCHAR(MAX)''), 1, 2, '''') 
    FROM #temp t 
) t3 
PIVOT (
    MAX(category) 
    FOR rn IN (' + @Columns + ') 
) p' 

PRINT @SQL 

EXECUTE sys.sp_executesql @SQL 

출력 :

SELECT [user], [Category1],[Category2],[Category3], Dates 
FROM (
    SELECT 
      t.[user] 
     , t.category 
     , rn = 'Category' + CAST(ROW_NUMBER() OVER (PARTITION BY t.[user] ORDER BY (SELECT 1)) AS VARCHAR(3)) 
     , Dates = STUFF((
       SELECT ', ' + CONVERT(VARCHAR(10), t2.[Date], 103) 
       FROM #temp t2 
       WHERE t2.[user] = t.[user] 
       FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 2, '') 
    FROM #temp t 
) t3 
PIVOT (
    MAX(category) 
    FOR rn IN ([Category1],[Category2],[Category3]) 
) p 

결과 :

user  Category1 Category2 Category3 Dates 
---------- ---------- ---------- ---------- ------------------------------------- 
Jack  Shoes  Tie  Glass  01/01/2011, 02/01/2011, 03/03/2011 
Peggy  Shoe  Skirt  NULL  02/02/2012, 02/12/2013