1

我有这个工作正常的 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 给了我所有的客户记录。

4

3 回答 3

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 by 以获得准确的结果。

GROUP BY j.client_id, c.name 
ORDER BY result DESC
于 2013-03-11T08:49:52.327 回答
2

我想你想得到NAMEfor each client_id

您还需要nameGROUP 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
于 2013-03-11T08:49:55.497 回答
1

您遇到了标准行为的 Sybase 扩展GROUP BY。从文档中(请参阅“Transact-SQL extensions to group by and having”页面的中间部分):

标准 SQL 的 Transact-SQL 扩展通过允许引用不用于创建组或汇总计算的列和表达式,使显示数据更加灵活:

  • 包含聚合的选择列表可以包含不是聚合函数的参数且不包含在 group by 子句中的扩展列。扩展列会影响最终结果的显示,因为会显示额外的行。

    • group by 子句可以包括不在选择列表中的列或表达式。

...

当 Transact-SQL 扩展向显示添加行和列时,或者如果省略 group by,查询结果可能难以解释。

该页面中的示例解释了会发生什么:

Transact-SQL 扩展列 price(在选择列表中,但不是聚合且不在 group by 子句中)导致所有合格的行显示在每个合格的组中,即使标准的 group by 子句每次生成一行团体。group by 仍然影响矢量聚合,它计算显示在每个组的每一行上的每个组的平均价格(它们与例如 a 计算的值相同)

请注意,标准行为GROUP BY不允许这样做,并且会产生“使用未在 group-by 子句中指定的非聚合列”的错误。


对于您的查询,您还应该c.name 按 JW 分组。建议

于 2013-03-11T09:02:34.043 回答