2009-10-30 25 views
6

Có cách nào để đưa biểu thức LIKE vào truy vấn GROUP BY không? Ví dụ:T-SQL - GROUP BY với LIKE - điều này có khả thi không?

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

column_x:

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

Kết quả:

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

Tôi không hiểu bạn muốn làm gì. Nếu cũng có một hàng với "HIST Spring_2009", kết quả mong đợi là gì? – Cellfish

+0

@Cellfish: Tôi tin rằng những gì mà người đăng muốn muốn là trích xuất từ ​​trường ra khỏi cột và nhóm không chuẩn hóa trong học kỳ, ném ra phần tên khóa học của văn bản. –

Trả lời

16

Bạn cần biểu thức trả về "Fall_2009" hoặc "Spring_2009", sau đó nhóm trên biểu thức đó. ví dụ:

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

hoặc

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

hoặc

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

Tôi muốn thử đề xuất đầu tiên của bạn nhưng tôi không chắc chắn tôi biết cách cấu trúc câu lệnh .. Bạn có nhớ đăng một ví dụ về cách nó phù hợp không? – fieldingmellish

+0

Tôi đã đặt ví dụ đầu tiên trong ngữ cảnh. Bạn có thể di chuyển group_by_column đến một truy vấn con như giải pháp của rexem để tránh sự lặp lại. Tôi nghĩ rằng ví dụ 3 là tốt nhất, mặc dù. –

1

Tôi không tin như vậy, LIKE là một cách hiệu quả tình trạng nhị phân - một cái gì đó là thích hay không thích, không có mức độ hợp lý của 'giống' có thể được nhóm lại với nhau. Sau đó, một lần nữa, tôi có thể được tắt rocker của tôi.

Nếu những gì bạn thực sự muốn là thể hiện lọc qua dữ liệu được nhóm của bạn, hãy xem mệnh đề HAVING.

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

2

NHƯ không có ý nghĩa trong bối cảnh của bạn, vì nó một trong hai trận đấu hay không, nhưng nó không thành lập nhóm. Bạn sẽ phải sử dụng các hàm chuỗi phân tích các giá trị cột thành những gì có ý nghĩa đối với dữ liệu của bạn.

0

Bạn có thể có nó theo cách này, nhưng cũng giống như những người khác nói, không thực sự có ý nghĩa:

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

Không, hàm NHƯ không được hỗ trợ trong mệnh đề GROUP BY. Bạn cần phải sử dụng:

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

Điều đó có hiệu quả không? Tôi đã nghĩ CHARINDEX ('Fall_2009', t.column)> 0 –

+0

Biết tôi đã quên thứ gì đó - đã sửa, thx. –

0

Thật không may, bạn có cơ sở dữ liệu có cấu trúc kém, kết hợp SUBJECT và TERM vào cùng một cột. Khi bạn sử dụng GROUP BY, nó xử lý từng giá trị duy nhất trong cột dưới dạng một nhóm trong tập hợp kết quả. Bạn nên được tốt nhất nên cơ cấu lại cơ sở dữ liệu nếu có thể - bạn có thể muốn ba cột ở đây (SUBJECT, TERM, SCHOOL_YEAR) nhưng hai có thể là thích hợp.

Nếu bạn không thể cấu trúc lại cơ sở dữ liệu, bạn sẽ cần phân tích cú pháp cột để trích xuất thuật ngữ. Rexem cho bạn thấy một cách để làm điều này, bạn cũng có thể sử dụng một thủ tục được lưu trữ.

+0

vâng, tôi biết rằng đi vào nó - nó không phải db của tôi để thay đổi/thiết kế lại hoặc nếu không tôi sẽ thiết kế nó như bạn đề nghị. – fieldingmellish

1

Nếu khóa học của bạn luôn luôn lấy năm chữ cái, bạn có thể giữ nó thực sự đơn giản:

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

Nếu không, kiểm tra Peters hoặc câu trả lời của Rexem.

-2

u có thể sử dụng tis đang

SELECT COUNT (*)
từ tblWhatever GROUP BY column_x có column_x LIKE '% Fall-2009%'

làm việc trong MS-SQL 2005

bởi

B Senthil Kumaran

+2

@B Senthil Kumaran Xin lỗi nhưng -1. A) Chủ đề này là 7 tháng tuổi. B) Câu trả lời của bạn là * chính xác * giống như o.k.w và C) Nó không làm những gì mà OP muốn. –

0

Làm thế nào về điều này:

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 đang tìm kiếm nhóm theo cách tương tự, chứ không phải lọc theo. Điều này sẽ không hoạt động. –

Các vấn đề liên quan