Incluir de manera eficiente la columna que no está en Group By de SQL Query

Dado

Tabla A

Id INTEGER Name VARCHAR(50) 

Tabla B

 Id INTEGER FkId INTEGER ; Foreign key to Table A 

Deseo contar las apariciones de cada valor FkId :

 SELECT FkId, COUNT(FkId) FROM B GROUP BY FkId 

Ahora simplemente también quiero dar salida al Nombre de la Table A

Esto no funcionará:

 SELECT FkId, COUNT(FkId), a.Name FROM B b INNER JOIN A a ON a.Id=b.FkId GROUP BY FkId 

porque a.Name no está contenido en la cláusula GROUP BY (produce is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause error de is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause ).

El punto es pasar de un resultado como este

 FkId Count 1 42 2 25 

para salir como este

 FkId Count Name 1 42 Ronald 2 22 John 

Hay bastantes coincidencias en SO para ese post de error, pero algunos, por ejemplo, https://stackoverflow.com/a/6456944/141172 tienen comentarios como "generarán 3 escaneos en la tabla, en lugar de 1, por lo que no se escalarán". ".

¿Cómo puedo include eficientemente un campo de la Table B unida (que tiene una relación 1: 1 con FkId ) en la salida de la consulta?

Puedes probar algo como esto:

  ;WITH GroupedData AS ( SELECT FkId, COUNT(FkId) As FkCount FROM B GROUP BY FkId ) SELECT gd.*, a.Name FROM GroupedData gd INNER JOIN dbo.A ON gd.FkId = A.FkId 

Cree un CTE (Common Table Expression) para manejar la agrupación / conteo en su Table B , y luego una ese resultado (una fila por FkId ) a la Table A y tome algunas columnas más de la Table A en su set de resultados final.

¿Intentó agregar el campo al grupo?

 SELECT FkId, COUNT(FkId), a.Name FROM B b INNER JOIN A a ON a.Id=b.FkId GROUP BY FkId,a.Name 
 select t3.Name, t3.FkId, t3.countedFkId from (a t1 join (select t2.FkId, count(FkId) as countedFkId from b t2 group by t2.FkId) on t1.Id = t2.FkId) t3;