GROUP BY A.*
não é permitido no SQL.
Você pode contornar isso usando uma subconsulta na qual agrupa e depois ingressar em:
SELECT A.*, COALESCE(B.cnt, 0) AS Count_B_Foo
FROM TABLE1 AS A
LEFT JOIN
( SELECT FKey, COUNT(foo) AS cnt
FROM TABLE2
GROUP BY FKey
) AS B
ON A.PKey = B.FKey ;
Há um recurso no padrão SQL-2003 para permitir na SELECT
lista colunas que não estão na GROUP BY
lista, desde que sejam funcionalmente dependentes delas. Se esse recurso tivesse sido implementado no SQL-Server, sua consulta poderia ter sido escrita como:
SELECT A.*, COUNT(B.foo)
FROM TABLE1 A
LEFT JOIN TABLE2 B ON A.PKey = B.FKey
GROUP BY A.pk --- the Primary Key of table A
Infelizmente, esse recurso ainda não foi implementado, nem na versão SQL-Server 2012 - e em nenhum outro DBMS, até onde eu saiba. Exceto pelo MySQL que o possui, mas inadequadamente (inadequadamente, como: a consulta acima funcionará, mas o mecanismo não verificará a dependência funcional e outras consultas incorretas mostrarão resultados semi-aleatórios errados).
Como o @Mark Byers nos informou em um comentário, o PostgreSQL 9.1 adicionou um novo recurso desenvolvido para essa finalidade. É mais restritivo que a implementação do MySQL.
GROUP BY
cláusula naSELECT
lista, mas deixa indefinido para qual linha esse valor virá (portanto, se a coluna ou expressão não for 't funcionalmente dependente da expressão de agrupamento, então ele pode vir de qualquer linha dentro do grupo).