2009-10-30 77 views
6

有沒有辦法在GROUP BY查詢中包含一個LIKE表達式?例如:T-SQL - 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

我不明白你想做什麼。如果還有一行「HIST Spring_2009」,那麼預期的結果是什麼? – Cellfish 2009-10-30 02:55:11

+0

@Cellfish:我相信海報想要的是從學校學期中的非規範化專欄和小組中抽出學期,拋出課程名稱的一部分。 – 2009-10-30 03:22:05

回答

16

您需要一個返回「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 
+0

我想嘗試一下你的第一個建議,但我不知道如何構建這個陳述。你是否介紹了一個如何/適合它的例子? – fieldingmellish 2009-10-30 04:19:35

+0

我已經把第一個例子放在上下文中。您可以將group_by_column移動到rexem的解決方案之類的子查詢中,以避免重複。不過,我認爲示例3是最好的。 – 2009-10-30 04:38:45

1

我不相信是這樣,就像是一個有效的二進制狀態 - 這是LIKE或不喜歡的,也有不「相似性」的邏輯程度可以組合在一起。然後,我可以離開我的搖桿。

如果您真正想要的是對分組數據表達過濾,請查看HAVING子句。

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

2

LIKE沒有意義在你的情況下,因爲它匹配或沒有,但它不建立組。 您將不得不使用字符串函數將列值解析爲適合您數據的內容。

0

你可以這樣說,但像其他人說,並沒有真正意義:

SELECT COUNT(*) 
    FROM tblWhatever 
GROUP BY column_x 
HAVING column_x LIKE '%Fall-2009%' 
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 
+0

這是否工作?我會以爲CHARINDEX('Fall_2009',t.column)> 0 – 2009-10-30 03:17:20

+0

知道我忘記了一些東西 - 更正了,thx。 – 2009-10-30 03:18:53

0

不幸的是,您的結構數據庫結構很糟糕,它將SUBJECT和TERM合併到同一列中。當您使用GROUP BY時,它會將列中的每個唯一值視爲結果集中的一個組。如果可能的話,最好建議您重新構建數據庫 - 您可能需要三列(SUBJECT,TERM,SCHOOL_YEAR),但兩個可能是合適的。

如果無法重構數據庫,則需要解析該列以提取該術語。 Rexem向你展示了一種方法來做到這一點,你也可以使用存儲過程。

+0

是的,我知道進入它 - 這不是我的數據庫來改變/重新設計,否則我會按照你的建議設計它。 – fieldingmellish 2009-10-30 04:12:01

1

如果你的課程始終以五個字母,你可以把它很簡單:

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

否則,請檢查Peters或Rexem的回答。

-2

u可以使用TIS代碼

SELECT COUNT(*)
從tblWhatever GROUP BY有column_x LIKE '%降至2009%'

在MS-SQL工作column_x 2005

通過

乙塞特希庫馬蘭

+2

@B Senthil Kumaran對不起,但-1。 A)這個線程是7個月大。 B)你的答案與* o.w的完全一致* C)它不會做OP所要的。 – 2010-06-05 13:46:33

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

該OP正在尋找羣像,而不是過濾。這不起作用。 – 2012-11-03 08:21:15