tables sintaxis example dynamically columns sql sql-server dynamic pivot

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);

Ver SQL Fiddle con demostración