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 の代わりにクライアント名を表示したい。2 番目の 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 everyを取得したいと思います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
于 2013-03-11T08:49:55.497 に答える
1

の標準動作に対する Sybase 拡張機能が実行されていますGROUP BYドキュメントから(ページの途中にある「Transact-SQL 拡張機能をグループ化してグループ化する」を参照):

標準 SQL に対する Transact-SQL 拡張機能を使用すると、グループの作成や集計計算には使用されない列や式への参照が可能になるため、データの表示がより柔軟になります。

  • 集計を含む選択リストには、集計関数の引数ではなく、group by 句に含まれない拡張列を含めることができます。追加の行が表示されるため、拡張された列は最終結果の表示に影響します。

    • group by 句には、選択リストにない列または式を含めることができます。

...

Transact-SQL 拡張機能によって行と列が表示に追加される場合、または group by が省略されている場合、クエリ結果が解釈しにくい場合があります。

そのページの例は、何が起こるかを説明しています:

Transact-SQL の拡張列である price (選択リストにありますが、集計ではなく、group by 句にはありません) を使用すると、標準の group by 句では 1 行ごとに 1 つの行が生成されますが、すべての適格な行が各適格なグループに表示されます。グループ。group by は、各グループの各行に表示されるグループごとの平均価格を計算するベクトル集計に引き続き影響します (これらは、たとえば a で計算された値と同じです)。

の標準的な動作でGROUP BYはこれが許可されず、「group-by 句で指定されていない非集計列の使用」というエラーが発生することに注意してください。


c.name クエリでは、 JW としてグループ化する必要もあります。提案します。

于 2013-03-11T09:02:34.043 に答える