2016-11-21 34 views
0

多变数我需要把这个:行到列,采用

Acct Email     SomeCategory 
0111 [email protected]    Commercial 
0222 [email protected]    Commercial 
0333 [email protected]    Commercial 
0111 [email protected]   Commercial 
0121 [email protected]   Residential 

进入这个:

Acct Email     SomeCategory Acct1 Acct2 Acct3 
0111 [email protected]    Commercial 0111  0222 0333 
0111 [email protected]   Commercial 0111 
0121 [email protected]   Residential 0121 

将有多达500场(!)。换句话说,每个客户记录(电子邮件地址+类别)可能有1到500个Acct号码。

我看不到如何使用Pivot从Acct列的内容动态创建列名称,因为Acct列中有成千上万的值,而SQL不会允许,我只能最多需要500个。

它将在Excel工作表中结束。

我知道它看起来疯了...这不是我的主意,一个客户端,要求它...

任何想法?在

+1

很多SQL答案的SO动态透视 – xQbert

+2

的可能的复制[SQL Server的动态PIVOT查询?](http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query) – xQbert

回答

0
IF OBJECT_ID('tempdb..#Tbl') IS NOT NULL 
    BEGIN 
     DROP TABLE #Tbl 
    END 

CREATE TABLE #Tbl (
    Acct CHAR(4) 
    ,Email VARCHAR(100) 
    ,SomeCategory VARCHAR(25) 
) 

INSERT INTO #Tbl VALUES 
('0111','[email protected]','Commercial') 
,('0222','[email protected]','Commercial') 
,('0333','[email protected]','Commercial') 
,('0111','[email protected]','Commercial') 
,('0121','[email protected]','Residential') 

DECLARE @Cols as NVARCHAR(MAX) 
DECLARE @query as NVARCHAR(MAX) 

SET @Cols = STUFF(
    (
     SELECT ',' + QUOTENAME('Acct' + CAST(RowNumber AS NVARCHAR(10))) 
     FROM 
      (
      SELECT DISTINCT ROW_NUMBER() OVER (PARTITION BY Email, SomeCategory ORDER BY Acct) as RowNumber 
      FROM 
       #Tbl 
     ) t 
     WHERE 
      t.RowNumber <= 500 
     FOR XML PATH(''), TYPE 
    ).value('.','NVARCHAR(MAX)') 
    ,1,1, '') 

SET @query = ' 
SELECT * 
FROM 
    (
     SELECT 
      Acct 
      ,Email 
      ,SomeCategory 
      ,''Acct'' + CAST((ROW_NUMBER() OVER (PARTITION BY Email, SomeCategory ORDER BY Acct)) AS NVARCHAR(10)) as Col 
     FROM 
      #Tbl 
    ) t 
    PIVOT 
    (
     MAX(Acct) 
     FOR col IN (' + @Cols + ') 
    ) p' 

EXECUTE (@query)