T-SQL - GROUP BY与LIKE - 这可能吗?(T-SQL - GROUP BY

2019-09-02 11:36发布

有没有一种方法,包括在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

Answer 1:

你需要对表达式返回“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


Answer 2:

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

  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


Answer 3:

LIKE没有意义在你的情况下,因为它匹配或没有,但它不建立组。 你将不得不使用解析列值成什么样的数据是有意义的字符串函数。



Answer 4:

我不相信这样,就像是一个有效的二进制状态 - 这是LIKE或不喜欢的,也有不符合逻辑度可能被组合在一起“神似”的。 再然后,我就可以把我的摇杆。

如果你真正想要的是在你的分组数据看看HAVING子句来表达过滤。

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



Answer 5:

如果你的课程始终以五个字母,你可以把它很简单:

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

否则,检查彼得斯或Rexem的答案。



Answer 6:

你可以这样说,但像其他人说,并没有真正意义:

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


Answer 7:

不幸的是,你有一个严重的结构化数据库,具有组合的主题和TERM到同一列。 当您使用GROUP BY它列对待每个唯一值在结果集的一组。 你最好劝重组数据库中,如果在所有可能的 - 你可能想在这里三列(主题,TERM,SCHOOL_YEAR)而是两个有可能会是适当的。

如果你不能重组的数据库,你需要解析列提取术语。 Rexem表明你做到这一点的一种方式,你也可以使用一个存储过程。



Answer 8:

这个怎么样:

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


文章来源: T-SQL - GROUP BY with LIKE - is this possible?