2011-02-03 6 views
0

SQL Server 2008のクエリのうちの1つで不満を感じています。それは正常に解析されますが、実行しようとするとクラッシュします。私が手にエラーは次のとおりです:SQL ServerのGROUP BYトラブルが発生しました。

8120メッセージ、レベル16、状態1、行4それ はいずれにも含まれていないため 「customertraffic_return.company」は、選択リストに無効 ある
コラム 集約関数またはGROUP BY 節。

SELECT * 
FROM (SELECT ctr.sp_id      AS spid, 
      Substring(ctr.company, 1, 20) AS company, 
      cci.email_address    AS tech_email, 
      CASE 
      WHEN rating IS NULL THEN 'unknown' 
      ELSE rating 
      END       AS rating 
    FROM customer_contactinfo cci 
      INNER JOIN customertraffic_return ctr 
      ON ctr.sp_id = cci.sp_id 
    WHERE cci.email_address <> '' 
      AND cci.email_address NOT LIKE '%hotmail%' 
      AND cci.email_address IS NOT NULL 
      AND (region LIKE 'Europe%' 
        OR region LIKE 'Asia%') 
      AND SERVICE IN ('1', '2') 
      AND (rating IN ('Premiere', 'Standard', 'unknown') 
        OR rating IS NULL) 
      AND msgcount >= 5000 
    GROUP BY ctr.sp_id, 
       cci.email_address) AS a 
WHERE spid NOT IN (SELECT spid 
       FROM customer_exclude) 
GROUP BY spid, 
     tech_email 
+1

のErm。このコードで実際に何をしたいですか?期待される成果は? –

+0

2つのGROUP BYステートメントを削除すると、クエリが実行され、 "spid" "company" "tech_email"と "Rating"という列の大きなデータセットが返されます。これは予想されるもので、Group Byは私が信じる複製を削除するために使用されます。 (新しいSQLと私は誰かがelsesクエリで働いています) – Lucas311

+0

GROUP BYはデータをグループ化します - 単に "重複を取り除く"だけではありません。だから、まさにあなたはそうしようとしているのですか? GROUP BYは、SUM、COUNT、MIN、MAXなどの集約で通常使用されます - あなたはそれを持っていないようです。 –

答えて

1

私は完全に指定された列リストに*を置き換えることをお勧めします。

+0

私はこれを試してみましたが、元のエラーを修正していない方が良いと思います。 SELECT spid、company、tech_email、rating FROM .... – Lucas311

+1

「SELECT *」はプロダクションコードで使用しないでください。これだけでは問題は解決しません.... –

4

まあ、エラーはかなり明確です、いいえ??

あなたは、あなたの内側のSELECTでそれらの列を選択している:

  • SPID
  • 会社
  • tech_email評価

とあなたのグループ化をのみの2(GROUP BY ctr.sp_id, cci.email_addressで)。

はどちらかあなたはそれらのすべての4つの(GROUP BY ctr.sp_id, cci.email_address, company, rating)でグループを必要とするか、他の二つの列(companyrating)に集約関数(SUM、AVG、MIN、MAX)を適用する必要があります。

GROUP BYを使用すると、ここで全く間違ったやり方があります。実際にここで何をしようとしていますか?

+0

ありがとうMarc、上記のマット・ギブソンに対する私の返事が、私が何をしようとしているのか見ることができます。 – Lucas311

+0

@ Lucas311:OK、GROUP BYを削除すると、あまりにも多くの行が得られます。どちらの行が本当に必要ですか?どの基準に基づいてデータを注文/フィルタリングしたいですか?各「会社」の上位5つのエントリを「評価」(最初に大きい順)で注文しますか?または何を探しているのですか?**予想された**結果が何であるかまだ明確ではありません... –

2

内側のクエリ:

SELECT ctr.sp_id      AS spid, 
      Substring(ctr.company, 1, 20) AS company, 
      cci.email_address    AS tech_email, 
      CASE 
      WHEN rating IS NULL THEN 'unknown' 
      ELSE rating 
      END       AS rating 
    FROM customer_contactinfo cci 
      INNER JOIN customertraffic_return ctr 
      ON ctr.sp_id = cci.sp_id 
    WHERE cci.email_address <> '' 
      AND cci.email_address NOT LIKE '%hotmail%' 
      AND cci.email_address IS NOT NULL 
      AND (region LIKE 'Europe%' 
        OR region LIKE 'Asia%') 
      AND SERVICE IN ('1', '2') 
      AND (rating IN ('Premiere', 'Standard', 'unknown') 
        OR rating IS NULL) 
      AND msgcount >= 5000 
    GROUP BY ctr.sp_id, 
       cci.email_address 

は、彼ら二人のselect(sp_idcompanyemail_addressrating)とあなただけのグループで4非集計のものを持っているので、上のエラーを投げています一つ目は、それはあなたがどちらかがどちらかのグループ選択されたすべての列によって、缶または他の列(NOT INを使用してそれらのすべてによって、それらまたはグループのいずれかによりグループ

+0

ありがとうダニエル!このクエリはMySQLで正常に動作するのでしょうか? MySQLとSQL Serverの両方のバージョンのデータベースがあり、クエリはMySQLで動作するためです。 – Lucas311

+0

私が考えることができるのは、MySQLがこの内部クエリに「GROUP」が役に立たないという集約がないので、MySQLが推論していることだけです。 –

+2

@ルーカス:MySQLには特別な「機能」(!)があり、選択しているすべての列をGROUP BY句に含める必要はありません。これは非標準のSQLであり、この '機能'を持つ唯一のエンジンです。 –

1

をする必要はありません

を見て合計のような集計関数内のGROUP BY句)()

あなたがすることはできません。select a,b,c from bla group by a,b が、次のことができます。select a,b,sum(c) from bla groupy by a,b