2009-10-30 18 views
6

¿Hay alguna manera de incluir una expresión LIKE en una consulta GROUP BY? Por ejemplo:T-SQL - GROUP BY con LIKE - ¿Esto es posible?

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

column_x:

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

Resultado:

------ 
Fall_2009 2 
Spring_2009 1 
+0

No entiendo lo que quiere hacer.Si también había una fila con "HIST Spring_2009", ¿cuál es el resultado esperado? – Cellfish

+0

@Cellfish: Creo que lo que el afiche desea es extraer el término escolar de la columna y grupo desnormalizados en el término escolar, descartando el nombre del curso como parte del texto. –

Respuesta

16

Necesita una expresión que devuelva "Fall_2009" o "Spring_2009", y luego agrupe en esa expresión. por ejemplo:

-- 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 

o

-- 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),'') 

o

-- 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 
+0

Me gustaría probar su primera sugerencia, pero no estoy seguro de saber cómo estructurar la declaración. ¿Le importa publicar un ejemplo de cómo/dónde cabe? – fieldingmellish

+0

He puesto el primer ejemplo en contexto. Podrías mover el group_by_column a una subconsulta como la solución de rexem para evitar la repetición. Creo que el ejemplo 3 es el mejor, sin embargo. –

1

Yo no lo creo así, me gusta es efectivamente un estado binario - algo que es como o no me gusta, no hay grados lógicos de 'similitud' que podrían agruparse. Por otra parte, podría estar fuera de mi rockero.

Si lo que realmente desea es expresar el filtrado sobre sus datos agrupados, eche un vistazo a la cláusula HAVING.

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

2

LIKE no tiene sentido en su contexto, ya que cualquiera de coincidencias o no lo hace, pero no establece grupos. Tendrá que usar funciones de cadena que analizan los valores de columna en lo que tiene sentido para sus datos.

0

se puede tener de esta manera, pero al igual que los otros dijeron, no tiene mucho sentido:

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

No, la función como no se admite en la cláusula GROUP BY. Tendrá que utilizar:

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 
+0

¿Eso funciona? Pensé que CHARINDEX ('Fall_2009', t.column)> 0 –

+0

Sabía que olvidé algo - corregido, gracias. –

0

Desafortunadamente, tiene una base de datos mal estructurada, con SUBJECT y TERM combinados en la misma columna. Cuando usa GROUP BY, trata cada valor único en la columna como un grupo en el conjunto de resultados. Lo más recomendable es reestructurar la base de datos, si es posible; probablemente desee tres columnas aquí (SUBJECT, TERM, SCHOOL_YEAR) pero posiblemente dos sean apropiadas.

Si no puede reestructurar la base de datos, deberá analizar la columna para extraer el término. Rexem le mostró una forma de hacerlo, también podría usar un procedimiento almacenado.

+0

sí, sabía que entrar en eso - no es mi DB cambiar/rediseñar o de lo contrario lo habría diseñado como sugieres. – fieldingmellish

1

Si sus cursos siempre tienen cinco letras, que puede mantenerlo muy simple:

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

De lo contrario, Cheque La respuesta de Peters o Rexem.

-2

u puede utilizar tis código

SELECT Count (*)
de tblWhatever GROUP BY column_x tener column_x LIKE% Otoño-2009% '

trabajando en MS-SQL 2005

por

B Senthil Kumaran

+2

@B Senthil Kumaran Lo siento pero -1. A) Este hilo tiene 7 meses de edad. B) Su respuesta es * exactamente * lo mismo que o.k.w's y C) No hace lo que el OP quiere de todos modos. –

0

¿Qué tal esto:

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

El OP está buscando grupo por me gusta, no filtrado por. Esto no funcionará –