T-SQL - LIKE的GROUP BY - 这可能吗?

时间:2009-10-30 02:46:12

标签: sql sql-server tsql

有没有办法在GROUP BY查询中包含LIKE表达式?例如:

SELECT Count(*) 
FROM tblWhatever
GROUP BY column_x [LIKE %Fall-2009%]

column_x:

--------
BIOL-Fall_2009
HIST Fall_2009
BIOL Spring_2009

结果:

------
Fall_2009   2
Spring_2009 1

8 个答案:

答案 0 :(得分:17)

您需要一个返回“Fall_2009”或“Spring_2009”的表达式,然后对该表达式进行分组。例如:

-- identify each pattern individually w/ a case statement
SELECT
  CASE
    WHEN column_x LIKE '%Fall[_]2009'   THEN 'Fall 2009'
    WHEN column_x LIKE '%Spring[_]2009' THEN 'Spring 2009'
  END AS group_by_value
, COUNT(*) AS group_by_count
FROM Table1 a
GROUP BY 
  CASE
    WHEN column_x LIKE '%Fall[_]2009'   THEN 'Fall 2009'
    WHEN column_x LIKE '%Spring[_]2009' THEN 'Spring 2009'
  END

-- strip all characters up to the first space or dash
SELECT 
  STUFF(column_x,1,PATINDEX('%[- ]%',column_x),'') AS group_by_value
, COUNT(*) as group_by_count
FROM Table1 a
GROUP BY 
  STUFF(column_x,1,PATINDEX('%[- ]%',column_x),'')

-- join to a (pseudo) table of pattern masks
SELECT b.Label, COUNT(*)
FROM Table1 a
JOIN (
  SELECT '%Fall[_]2009'  , 'Fall, 2009' UNION ALL
  SELECT '%Spring[_]2009', 'Spring, 2009'
  ) b (Mask, Label) ON a.column_x LIKE b.Mask
GROUP BY b.Label

答案 1 :(得分:3)

不,GROUP BY子句不支持LIKE功能。您需要使用:

  SELECT x.term,
         COUNT(*)
    FROM (SELECT CASE
                   WHEN CHARINDEX('Fall_2009', t.column) > 0 THEN
                     SUBSTRING(t.column, CHARINDEX('Fall_2009', t.column), LEN(t.column))
                   WHEN CHARINDEX('Spring_2009', t.column) > 0 THEN
                     SUBSTRING(t.column, CHARINDEX('Spring_2009', t.column), LEN(t.column))
                   ELSE
                     NULL
                 END as TERM
            FROM TABLE t) x
GROUP BY x.term

答案 2 :(得分:2)

LIKE在你的上下文中没有意义,因为它匹配或不匹配,但它不建立组。 您必须使用字符串函数将列值解析为对数据有意义的值。

答案 3 :(得分:1)

我不相信,LIKE实际上是一个二元状态 - 有点像或不像,没有可以组合在一起的“相似度”的逻辑度。然后,我可能会离开我的摇杆。

如果您真正想要的是对分组数据进行过滤,请查看HAVING子句。

http://msdn.microsoft.com/en-us/library/ms180199.aspx

答案 4 :(得分:1)

如果你的课程总是带五个字母,你可以保持简单:

SELECT substring(column_x,5,100), count(*)
FROM YourTable
GROUP BY substring(column_x,5,100)

否则,请查看Peters或Rexem的答案。

答案 5 :(得分:0)

你可以这样做,但就像其他人所说的那样,真的没有意义:

SELECT COUNT(*) 
    FROM tblWhatever
GROUP BY column_x 
HAVING column_x LIKE '%Fall-2009%'

答案 6 :(得分:0)

不幸的是,您有一个结构严重的数据库,将SUBJECT和TERM组合到同一列中。使用GROUP BY时,它会将列中的每个唯一值视为结果集中的一个组。如果可能的话,最好建议重组数据库 - 你可能想要三列(SUBJECT,TERM,SCHOOL_YEAR),但有两列可能是合适的。

如果无法重构数据库,则需要解析列以提取术语。 Rexem向您展示了一种方法,您也可以使用存储过程。

答案 7 :(得分:0)

这个怎么样:

SELECT MAX(column_x) AS column_x 
FROM (
    SELECT column_x 
    FROM tblWhatever 
    WHERE (UPPER(column_x) LIKE  '%Fall-2009%')
) AS derivedtbl_1 GROUP BY column_x