sql-server - multiples - sql server pivot sintaxis
PIVOT en sql 2005 (5)
No estoy seguro de que lo que estás haciendo sea realmente posible (o al menos práctico) en SQL. No estoy seguro, porque aún no estoy seguro de qué es lo que quieres hacer.
Puede compilar esa tabla dinámica en su aplicación cliente, por ejemplo con:
select distinct Letter from MyTable
para obtener la lista de letras, y luego usar una consulta parametrizada dentro de un ciclo:
select Number from MyTable where Letter=:letter
para obtener la lista de números para cada letra.
Necesito pivotar una columna (columna Números). ejemplo necesita esta información:
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
Se parece a esto
a 1 2
b 3 4
c 5
d 6 7 8 9
e 10 11 12 13 14
cualquier ayuda sería muy apreciada ...
Solo porque quería obtener más experiencia con CTE, se me ocurrió lo siguiente:
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
Puede necesitar algunos ajustes, pero funcionó con tu ejemplo
Utilizando ROW_NUMBER()
, PIVOT
y algunos SQL dinámicos (pero no se necesita cursor):
CREATE TABLE [dbo].[_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 _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 _198716
)
SELECT code, '' + @select_list + ''
FROM p
PIVOT (
MIN(number)
FOR PIVOT_CODE IN (
'' + @pivot_list + ''
)
) AS pvt
''
PRINT @sql
EXEC (@sql)
Esta pregunta relacionada debe tener la respuesta que necesita: SQL Server: ejemplos de datos de cadenas PIVOTing
Un control de matriz en SSRS tiene columnas dinámicas, si estos datos están vinculados a un informe de todos modos, entonces podría usar eso. De lo contrario, deberá crear un sproc sql que genere el sql like en los ejemplos dinámicamente y luego lo ejecute.
La función de fusión también podría usarse aquí, similar a otras preguntas que se han formulado sobre la concatenación de datos.