Hay varias formas de transformar datos de varias filas en columnas.
Utilizando PIVOT
En SQL Server puede usar la PIVOT
función para transformar los datos de filas a columnas:
select Firstname, Amount, PostalCode, LastName, AccountNumber
from
(
select value, columnname
from yourtable
) d
pivot
(
max(value)
for columnname in (Firstname, Amount, PostalCode, LastName, AccountNumber)
) piv;
Ver demo .
Pivote con número desconocido de columnnames
Si tiene un número desconocido del columnnames
que desea transponer, puede usar SQL dinámico:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(ColumnName)
from yourtable
group by ColumnName, id
order by id
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = N'SELECT ' + @cols + N' from
(
select value, ColumnName
from yourtable
) x
pivot
(
max(value)
for ColumnName in (' + @cols + N')
) p '
exec sp_executesql @query;
Ver demo .
Usando una función agregada
Si no desea usar la PIVOT
función, puede usar una función agregada con una CASE
expresión:
select
max(case when columnname = 'FirstName' then value end) Firstname,
max(case when columnname = 'Amount' then value end) Amount,
max(case when columnname = 'PostalCode' then value end) PostalCode,
max(case when columnname = 'LastName' then value end) LastName,
max(case when columnname = 'AccountNumber' then value end) AccountNumber
from yourtable
Ver demo .
Usar múltiples combinaciones
Esto también podría completarse utilizando múltiples combinaciones, pero necesitará alguna columna para asociar cada una de las filas que no tiene en sus datos de muestra. Pero la sintaxis básica sería:
select fn.value as FirstName,
a.value as Amount,
pc.value as PostalCode,
ln.value as LastName,
an.value as AccountNumber
from yourtable fn
left join yourtable a
on fn.somecol = a.somecol
and a.columnname = 'Amount'
left join yourtable pc
on fn.somecol = pc.somecol
and pc.columnname = 'PostalCode'
left join yourtable ln
on fn.somecol = ln.somecol
and ln.columnname = 'LastName'
left join yourtable an
on fn.somecol = an.somecol
and an.columnname = 'AccountNumber'
where fn.columnname = 'Firstname'
cross join
lugar deleft join
porque cada subconsulta devuelve una fila.Este es más un método que un simple script, pero le brinda mucha más flexibilidad.
En primer lugar hay 3 objetos:
ColumnActionList
] -> contiene datos como parámetroproc_PivotPrepare
] -> prepara nuestros datosproc_PivotExecute
] -> ejecuta el scriptCREATE TYPE [dbo]. [ColumnActionList] AS TABLE ([ID] [smallint] NOT NULL, [ColumnName] nvarchar NOT NULL, [Action] nchar NOT NULL); VAMOS
Al ejecutar la primera consulta (pasando el DB de origen y el nombre de la tabla) obtendrá una consulta de ejecución pre-creada para el segundo SP, todo lo que tiene que hacer es definir la columna de su origen: + Estable + Valor (se utilizará para concentrar valores basados en eso) + Dim (columna que desea usar para pivotar)
¡Los nombres y tipos de datos se definirán automáticamente!
No puedo recomendarlo para ningún entorno de producción, pero hace el trabajo para las solicitudes ad hoc de BI.
fuente
Could not find stored procedure 'dbo.sp_PivotIt'.
Algún consejo?sp_Pivot_Execute
cambie aproc_PivotExecute
.