如何在MS SQL中对SUBSTRING()进行GROUP BY

时间:2012-06-28 14:59:38

标签: sql sql-server database group-by

我正在尝试编写一个查询来从我们的数据库中提取一些信息,我需要将其分组为字符串的一部分。所以我做了GROUP BY substring()。但是看起来即使我是substring()的列在SELECT语句中,它仍然会失败。我还尝试将substr()放在select中,并使用它来执行“AS x”,但是也会因为它在GROUP BY之后执行而失败。

SELECT 
M.Cabot_source, 
CASE substring(M.Cabot_source,6,1) 
WHEN 'C' THEN 'CoregUserNameLC' 
WHEN 'P' THEN 'PPC' 
WHEN 'O' THEN 'Organic' 
WHEN 'S' THEN 'Ad Swap' 
WHEN 'I' THEN 'Internal' 
ELSE 'Unknown' 
END as source_type
FROM members_ M 
WHERE M.Cabot_source != '' 
GROUP BY substring(M.Cabot_source,6,1)

这是它返回给我的错误:

数据库连接报告的SQL错误:

(0x3ddbe8) Lyris function: SQLClass::SendToSQLInternal() 
Lyris error description: Command.Open() failed with error code 80040e14 
Database error information: Error 8120: Column 'members_.Cabot_source' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 
(source: Microsoft OLE DB Provider for SQL Server) 
SQL Statement: SELECT M.Cabot_source, CASE substring(M.Cabot_source,6,1) WHEN 'C' THEN 'CoregUserNameLC' WHEN 'P' THEN 'PPC' WHEN 'O' THEN 'Organic' WHEN 'S' THEN 'Ad Swap' WHEN 'I' THEN 'Internal' ELSE 'Unknown' END as source_type FROM members_ M WHERE M.Cabot_source != '' GROUP BY substring(M.Cabot_source,6,1)

3 个答案:

答案 0 :(得分:1)

您必须对完整的案例陈述进行分组。

SELECT 
M.Cabot_source, 
  CASE substring(M.Cabot_source,6,1) 
   WHEN 'C' THEN 'CoregUserNameLC' 
   WHEN 'P' THEN 'PPC' 
   WHEN 'O' THEN 'Organic' 
   WHEN 'S' THEN 'Ad Swap' 
   WHEN 'I' THEN 'Internal' 
   ELSE 'Unknown' 
  END as source_type
FROM members_ M 
WHERE M.Cabot_source != '' 
GROUP BY 
  M.Cabot_source, 
  CASE substring(M.Cabot_source,6,1) 
   WHEN 'C' THEN 'CoregUserNameLC' 
   WHEN 'P' THEN 'PPC' 
   WHEN 'O' THEN 'Organic' 
   WHEN 'S' THEN 'Ad Swap' 
   WHEN 'I' THEN 'Internal' 
   ELSE 'Unknown' 
  END

答案 1 :(得分:0)

错误的罪魁祸首是::

(SELECT COUNT(*) FROM members_ M3 WHERE M3.Cabot_source = M.Cabot_source) as names, 
(SELECT COUNT(*) FROM members_ M2 WHERE M2.MemberType_ = 'normal' AND M2.Cabot_source = M.Cabot_source) 

答案 2 :(得分:0)

你可以select M.Cabot_source + group by M.Cabot_source或使用任何聚合函数,例如select max(M.Cabot_source)

唯一的例外是MySQL,其中有一个隐式聚合函数 - 我称之为return_random_record(M.Cabot_source),但MySQL的默认(可能是未定义的)行为不能通过SQL Server驱动程序获得