2011-02-03 103 views
0

我在其中一個SQL Server 2008查詢中遇到了令人沮喪的錯誤。它解析得很好,但當我嘗試執行時崩潰。我得到的錯誤是: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

呃。你真的想要這個代碼做什麼?你的預期產出是多少? – 2011-02-03 15:14:25

+0

那麼,如果我刪除了兩個GROUP BY語句,查詢就會運行並返回一個包含「spid」「company」「tech_email」和「Rating」列的大型數據集。這是預期的,Group By用於刪除我認爲重複的內容。 (SQL新手,我正在用別人查詢) – Lucas311 2011-02-03 15:22:26

+0

GROUP BY將數據分組 - 它不僅僅是「刪除重複項」。那麼你究竟想做什麼呢? GROUP BY通常與SUM,COUNT,MIN,MAX等集合一起使用 - 您似乎沒有任何其他內容,真的...... – 2011-02-03 15:24:21

回答

1

我建議更換*與完全指明列的列表。

4

那麼,錯誤是非常清楚的,沒有??

你選擇那些列你內心的選擇:

  • SPID
  • 公司
  • tech_email
  • 評級

和您的分組僅由兩個那些(GROUP BY ctr.sp_id, cci.email_address )。

要麼你需要按他們四個(GROUP BY ctr.sp_id, cci.email_address, company, rating),或者您需要一個聚集函數(SUM,AVG,MIN,MAX)適用於其他兩列(companyrating)。

或者,也許在這裏使用GROUP BY是完全錯誤的做法 - 你真的想在這裏做什麼?

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 

有4個非集合東西選擇(sp_idcompanyemail_addressrating),你只對其中兩個組中,所以它是在拋出一個錯誤第一個它認爲

所以,你要麼需要不按任何人或團體由所有的人都

1

您可以通過所有選定列組或使用其他列(不通過在聚合函數(如求和條款))

組不能:select a,b,c from bla group by a,b 但你可以:select a,b,sum(c) from bla groupy by a,b