T-SQL - GROUP BY с LIKE - это возможно? - PullRequest
9 голосов
/ 30 октября 2009

Есть ли способ включить выражение LIKE в запрос GROUP BY? Например:

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 ]

19 голосов
/ 30 октября 2009

Вам нужно выражение, которое возвращает «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
3 голосов
/ 30 октября 2009

Нет, функция 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
2 голосов
/ 30 октября 2009

LIKE не имеет смысла в вашем контексте, так как он либо совпадает, либо нет, но он не устанавливает группы. Вам нужно будет использовать строковые функции, которые анализируют значения столбцов в том, что имеет смысл для ваших данных.

1 голос
/ 30 октября 2009

Если ваши курсы всегда состоят из пяти букв, вы можете сделать это очень просто:

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

В противном случае проверьте ответ Петерса или Рексема.

1 голос
/ 30 октября 2009

Я не верю, что LIKE фактически является двоичным состоянием - что-то вроде LIKE или NOT LIKE, нет логических степеней «сходства», которые можно сгруппировать вместе. С другой стороны, я мог бы быть от моего рокера.

Если вы действительно хотите выразить фильтрацию по вашим сгруппированным данным, взгляните на предложение HAVING.

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

0 голосов
/ 28 декабря 2011

Как насчет этого:

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
0 голосов
/ 30 октября 2009

К сожалению, у вас плохо структурированная база данных, объединив SUBJECT и TERM в один столбец. Когда вы используете GROUP BY, он обрабатывает каждое уникальное значение в столбце как группу в наборе результатов. Вам лучше всего реструктурировать базу данных, если это вообще возможно - вам, вероятно, нужны три столбца здесь (SUBJECT, TERM, SCHOOL_YEAR), но два могут быть подходящими.

Если вы не можете реструктурировать базу данных, вам нужно проанализировать столбец, чтобы извлечь термин. Rexem показал вам один способ сделать это, вы также можете использовать хранимую процедуру.

0 голосов
/ 30 октября 2009

Вы можете получить это таким образом, но, как сказали другие, на самом деле не имеет смысла:

SELECT COUNT(*) 
    FROM tblWhatever
GROUP BY column_x 
HAVING column_x LIKE '%Fall-2009%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...