1

人物とそのマネージャーを同時に保持する人物テーブルがあります。
マネージャーのメールを選択するために SELF JOIN を使用していますが、多くの重複があります。

http://imageshack.us/photo/my-images/3/withoutgroupby.png

クエリで GROUP BY を使用するにはどうすればよいですか

SELECT              P.prs_id AS 'Employee_id', M.prs_id AS 'Manager_id', M.prs_email AS 'Manager_email'
FROM                qrd_prs_person AS P
LEFT OUTER JOIN     qrd_prs_person AS M  
ON                  P.prs_manager_number = M.prs_number

GROUP BY M.prs_id

Manager_id でグループ化するクエリの最後にこの行を追加すると、このエラーが表示されます

列 'qrd_prs_person.prs_id' は、集計関数にも GROUP BY 句にも含まれていないため、選択リストでは無効です。

4

5 に答える 5

3

あなたが何を達成しようとしているのかよくわかりませんか?

マネージャーの情報を含む2つのオプションの列を使用して、従業員ごとに1行を返すクエリを実行している場合、元のクエリは正しいです(group byなし)。関係は多対1であり、「多」ごとに1つの(オプションの)「1つ」を持つ行から開始するため、グループ化する必要はありません。

ただし、これは、データが正しく、prs_numberが実際には各従業員に対して一意であることを前提としています。prs_numberを共有するマネージャーが2人以上いる場合は、複数のマネージャーを持つ人がいることになります。

これを外部に参加させることで、マネージャーのいない人々(つまり、食物連鎖のトップ:))も戻ってきますが、これはあなたの意図でしたか?

編集

マネージャーのみを返したい場合は、最初の列(P.prs_id)を保持して、マネージャーごとに1つの行を取得することはできません。1人以上の人を管理する人のリストが必要な場合は、これでうまくいきます。

SELECT              M.prs_id AS 'Manager_id', M.prs_email AS 'Manager_email'
FROM                qrd_prs_person AS P
INNER JOIN          qrd_prs_person AS M  
ON                  P.prs_manager_number = M.prs_number
GROUP BY            M.prs_id, M.prs_email
于 2011-10-05T11:48:25.173 に答える
2

Min、Max、Sum、またはグループ化が必要なものが表示されないのに、なぜグループ化する必要があるのですか? たぶんorder by十分でしょうか?とにかく、もしあなたがGROUP BY、SUMmedまたはMINedなどではない列は、GROUP BY句に存在する必要があります。

于 2011-10-05T11:28:17.620 に答える
0

select ステートメント内のすべての列をグループ化するか、集計関数を使用する必要があります。MAX(qrd_prs_person.prs_id) を追加してみて、機能するかどうかを確認してください。あなたを助けるはずです:-)

また、グループごとに電子メール ID の部分を追加する必要があります。それ以外の場合は、MAX() を使用します。クエリは次のようになります。

SELECT  MAX(P.prs_id) AS 'Employee_id', 
        M.prs_id AS 'Manager_id', 
        M.prs_email AS 'Manager_email'
FROM                
    qrd_prs_person AS P
    LEFT OUTER JOIN     
        qrd_prs_person AS M  ONP.prs_manager_number = M.prs_number
GROUP BY 
    M.prs_id, M.prs_email
于 2011-10-05T11:28:24.907 に答える
0

MySQL を使用している場合は、グループから M.prs_id 値の 1 つを取得するだけです。しかし、これらの値はグループ内で異なる可能性があるため、それらの値をランダムに選択するだけでは意味がありません。それが、SQL Server が不平を言う理由です。

GROUP BY の仕組みを誤解していると思います。このクエリで正確に何を達成しようとしていますか?

于 2011-10-05T11:29:34.610 に答える
0

問題は、 を実行すると、 select 句group byの内容に対して突然多くの可能な回答が得られることです。P.prs_id AS 'Employee_id'(マネージャーの従業員ごとに 1 つ。) SQL Sever は、そこに行きたいものを正確に知りたいので、そのすべての値を 1 つの値に合計する何らかの方法を提供するように要求しています。

おそらく、従業員の数を取得したいので、単に に置き換えてCOUNT(P.prs_id) AS 'Employee_count'ください。

M.prs_emailまた、group by 句に追加する必要があります。

于 2011-10-05T11:34:10.957 に答える