2011-02-03 225 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