我有这个SQL语句工作正常..
SELECT result=count(j.client_id), j.client_id
FROM spp_job j
GROUP BY j.client_id
ORDER BY count(j.client_id) DESC
但使用LEFT JOIN时失败
SELECT result=count(j.client_id), c.name
FROM spp_job j
LEFT JOIN spp_client c ON j.client_id = c.id
GROUP BY j.client_id
ORDER BY count(j.client_id) DESC
我不知道出了什么问题。我想显示客户端名称而不是他们的ID。第二个SQL给我所有客户记录。
答案 0 :(得分:2)
由于您使用左连接列出了c.name,因此需要Group By c.name instead j.client_id
SELECT result=count(j.client_id), c.name
FROM spp_job j LEFT JOIN
spp_client c ON j.client_id = c.id
GROUP BY c.name
ORDER BY result DESC
更新:由于名称不是唯一的(如@lc。所说),您可能需要按ID和名称使用group来获得准确的结果。
GROUP BY j.client_id, c.name
ORDER BY result DESC
答案 1 :(得分:2)
我认为您希望每NAME
获得client_id
。
您还需要在name
子句中添加GROUP BY
,因为该列不是聚合,
SELECT result = count(j.client_id),
c.name
FROM spp_job j
LEFT JOIN spp_client c
ON j.client_id = c.id
GROUP BY j.client_id, c.name
ORDER BY result DESC
答案 2 :(得分:1)
您正在使用Sybase扩展来处理GROUP BY
的标准行为。来自the documentation(请参阅“Transact-SQL扩展到分组依旧”页面的中间位置):
标准SQL的Transact-SQL扩展通过允许引用未用于创建组或汇总计算的列和表达式,使显示数据更加灵活:
包含聚合的选择列表可以包含不是聚合函数参数的扩展列,并且不包含在group by子句中。扩展列会影响最终结果的显示,因为会显示其他行。
- group by子句可以包含不在选择列表中的列或表达式。
...
当Transact-SQL扩展向显示添加行和列时,或者如果省略group by,查询结果可能难以解释。
该页面的示例解释了会发生什么:
Transact-SQL扩展列,价格(在选择列表中,但不是聚合而不在group by子句中),导致所有限定行显示在每个限定组中,即使标准group by子句生成每组单行。 group by仍影响向量聚合,它计算每组每行显示的每组平均价格(它们与例如a计算的值相同)
请注意GROUP BY
的标准行为不允许这样做,并且会产生“使用未在分组子句中指定的非聚合列”的错误。
对于您的查询,您还应该按c.name
as JW. suggests分组。