example - sql server pivot sintaxis
SQL Server-Dynamic Pivot (1)
Necesito ayuda. Tengo dos columnas, Lugar y Nombre, quiero un conteo de Nombre para cada lugar. Actualmente los datos se verían así:
Place | Name
100 OK
100 NEW
100 BAD
200 BAD
200 BAD
300 OK
400 OK
400 OK
400 OK
Estoy tratando de que se vea, sin embargo, estaría girando alrededor de 20 filas (por lo que me gustaría que la denominación sea dinámica
PLACE | OK | NEW | BAD
100 1 1 1
200 0 0 2
300 1 0 0
400 3 0 0
De un montón de otras preguntas, esto es lo que me ocurrió, sin embargo, no funciona. Cualquier ayuda sería muy apreciada.
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
SELECT @cols = STUFF((SELECT distinct
'','' +
QUOTENAME(NAMES)
FROM INFO_TABLE with (nolock)
FOR XML PATH(''''), TYPE
).value(''.'', ''NVARCHAR(MAX)'')
,1,1,'''');
SET @query = '' SELECT PLACE , '' + @cols + ''
FROM
(SELECT
CASE
WHEN NAME IS NOT NULL
THEN Count(NAME)
ELSE 0 END AS EXPR1,
PLACE
FROM INFO_TABLE with (nolock)) t
PIVOT
(
AVG(Expr1)
FOR NAME IN ('' + @cols + '' )
)
p '' ;
Execute(@query);
Su consulta actual está cerca, pero dado que desea count
la cantidad de names
, puede usarla como la función de agregado, en lugar de usar la instrucción CASE
en su subconsulta y luego promediar.
Mi sugerencia siempre sería escribir la consulta como una versión estática primero antes de intentar escribir un servidor SQL dinámico, principalmente para obtener la sintaxis correcta:
select place, Bad, New, OK
from
(
select place, name
from info_table
) d
pivot
(
count(name)
for name in (Bad, New, OK)
) p;
Ver SQL Fiddle con demostración . Una vez que tenga la lógica correcta, puede convertirla fácilmente en SQL dinámico:
DECLARE @cols AS NVARCHAR(MAX);
DECLARE @query AS NVARCHAR(MAX);
SELECT @cols = STUFF((SELECT distinct
'','' +
QUOTENAME(NAME)
FROM INFO_TABLE with (nolock)
FOR XML PATH(''''), TYPE
).value(''.'', ''NVARCHAR(MAX)'')
,1,1,'''');
SET @query = '' SELECT PLACE , '' + @cols + ''
FROM
(
SELECT NAME, PLACE
FROM INFO_TABLE with (nolock)
) t
PIVOT
(
count(name)
FOR NAME IN ('' + @cols + '' )
)
p '' ;
Execute(@query);