Pivot in sql 2005

Devo ruotare una colonna (colonna Numbers). esempio bisogno di questi dati:

a 1 a 2 b 3 b 4 c 5 d 6 d 7 d 8 d 9 e 10 e 11 e 12 e 13 e 14 

Assomiglia a questo

 a 1 2 b 3 4 c 5 d 6 7 8 9 e 10 11 12 13 14 

Qualsiasi aiuto sarebbe molto apprezzato…

Utilizzando ROW_NUMBER() , PIVOT e alcuni SQL dinamici (ma nessun cursore è necessario):

 CREATE TABLE [dbo].[stackoverflow_198716]( [code] [varchar](1) NOT NULL, [number] [int] NOT NULL ) ON [PRIMARY] DECLARE @sql AS varchar(max) DECLARE @pivot_list AS varchar(max) -- Leave NULL for COALESCE technique DECLARE @select_list AS varchar(max) -- Leave NULL for COALESCE technique SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + ']' ,@select_list = COALESCE(@select_list + ', ', '') + '[' + CONVERT(varchar, PIVOT_CODE) + '] AS [col_' + CONVERT(varchar, PIVOT_CODE) + ']' FROM ( SELECT DISTINCT PIVOT_CODE FROM ( SELECT code, number, ROW_NUMBER() OVER (PARTITION BY code ORDER BY number) AS PIVOT_CODE FROM stackoverflow_198716 ) AS rows ) AS PIVOT_CODES SET @sql = ' ;WITH p AS ( SELECT code, number, ROW_NUMBER() OVER (PARTITION BY code ORDER BY number) AS PIVOT_CODE FROM stackoverflow_198716 ) SELECT code, ' + @select_list + ' FROM p PIVOT ( MIN(number) FOR PIVOT_CODE IN ( ' + @pivot_list + ' ) ) AS pvt ' PRINT @sql EXEC (@sql) 

Solo perché volevo avere un po ‘di esperienza con i CTE, ho trovato il seguente:

 WITH CTE(CTEstring, CTEids, CTElast_id) AS ( SELECT string, CAST(id AS VARCHAR(1000)), id FROM dbo.Test_Pivot TP1 WHERE NOT EXISTS (SELECT * FROM dbo.Test_Pivot TP2 WHERE TP2.string = TP1.string AND TP2.id < TP1.id) UNION ALL SELECT CTEstring, CAST(CTEids + ' ' + CAST(TP.id AS VARCHAR) AS VARCHAR(1000)), TP.id FROM dbo.Test_Pivot TP INNER JOIN CTE ON CTE.CTEstring = TP.string WHERE TP.id > CTE.CTElast_id AND NOT EXISTS (SELECT * FROM dbo.Test_Pivot WHERE string = CTE.CTEstring AND id > CTE.CTElast_id AND id < TP.id) ) SELECT t1.CTEstring, t1.CTEids FROM CTE t1 INNER JOIN (SELECT CTEstring, MAX(LEN(CTEids)) AS max_len_ids FROM CTE GROUP BY CTEstring) SQ ON SQ.CTEstring = t1.CTEstring AND SQ.max_len_ids = LEN(t1.CTEids) ORDER BY CTEstring GO 

Potrebbe aver bisogno di qualche ritouch, ma ha funzionato con il tuo esempio

La funzione di coalescenza potrebbe anche essere utilizzata qui, in modo simile ad altre domande che sono state poste sulla concatenazione dei dati.

Come creare una funzione di SQL Server per “unire” più righe da una sottoquery in un singolo campo delimitato?

Questa domanda correlata dovrebbe avere la risposta che ti serve: SQL Server: esempi di dati String di PIVOT

Un controllo Matrix in SSRS ha colonne dinamiche, se questi dati sono comunque associati a un report, allora potresti usarlo. Altrimenti dovrai creare uno sql sproc che generi dynamicmente lo sql negli exaample e poi lo esegua.

Non sono sicuro che ciò che stai facendo sia realmente ansible (o almeno pratico) in SQL – non ne sono sicuro, perché non sono ancora esattamente sicuro di cosa vuoi fare.

È ansible creare quella tabella pivot nell’applicazione client, ad esempio con:

 select distinct Letter from MyTable 

per ottenere l’elenco di lettere e quindi utilizzare una query con parametri all’interno di un ciclo:

 select Number from MyTable where Letter=:letter 

per ottenere l’elenco dei numeri per ogni lettera.