有没有办法在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
答案 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子句。
答案 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