2010-07-21 27 views
10

Tôi đang sử dụng Oracle SQL và tôi muốn nhóm một số hàng khác nhau có kết quả chức năng 'thích'. Để xây dựng với một ví dụ:SQL: Có thể 'nhóm theo' theo kết quả của chức năng 'thích' không?


Giả sử tôi có một bảng MESA với một trong các cột là một chuỗi rất lớn. Và tôi đếm số lượng hàng phù hợp với mô hình cụ thể:

SELECT m.str, count(*) 
FROM MESA m 
WHERE m.str LIKE '%FRUIT%' 
AND (m.str LIKE '%APPLE%' OR m.str LIKE '%ORANGE%') 

Vì vậy, chúng ta hãy giả định là kết quả của truy vấn này là:

FRUIT..afsafafasfa ... RED_APPLE 20

FRUIT ..afsafafasfa ... YELLOW_APPLE 12

FRUIT..afsafafasfa ... GREEN_APPLE 3

FRUIT..afsafafasfa ... PURPLE_ORANGE 4

FRUIT..afsafafasfa ... RED_ORANGE 45

Nhưng tôi muốn kết quả của tôi là:

APPLE 35

CAM 49


Điều này có thể thực hiện được không? Nếu vậy, làm thế nào? :)

Nhận xét và đoạn mã được đánh giá cao.

PS: Tất nhiên truy vấn và kết quả phức tạp hơn ví dụ trên. Tôi chỉ viết nó như là vì sự đơn giản để giải thích.

Cheers ..

+2

Các chuỗi như thế nào: 'FRUIT..afsafafasfa ... ORANGE_APPLE "?;) – ThinkJet

+0

Vâng, đó là một nhận xét tốt. Đối với trường hợp của tôi, nó không phải là rất có khả năng có dây như vậy. Tôi đoán nó phụ thuộc vào thứ tự các trường hợp. – someone

Trả lời

11

chắc:

WITH Fruits AS (
    SELECT 
     CASE 
      WHEN m.str LIKE '%APPLE%' THEN 'Apple' 
      WHEN m.str LIKE '%ORANGE%' THEN 'Orange' 
     END AS FruitType   
    FROM MESA m 
    WHERE m.str LIKE '%FRUIT%') 
SELECT FruitType, COUNT(*) 
FROM Fruits 
WHERE FruitType IN ('Apple', 'Orange') 
GROUP BY FruitType; 
+1

Ok, nó hoạt động, +1 – ThinkJet

+0

Cảm ơn Dave. Tôi thích điều này với thingie:) – someone

0
SELECT count(*) AS 'Apples' 
FROM MESA m 
WHERE m.str LIKE '%FRUIT%' 
AND m.str LIKE '%APPLE%' 

SELECT count(*) AS 'Oranges' 
FROM MESA m 
WHERE m.str LIKE '%FRUIT%' 
AND m.str LIKE '%ORANGE%' 

Sẽ làm việc đó?

+0

Cảm ơn câu trả lời JNKyle. Tôi cũng đã nghĩ về điều này nhưng câu trả lời của Dave phù hợp hơn cho trường hợp của tôi (vì tôi có nhiều nhóm để làm) – someone

0

Something như thế này?

SELECT Fruit, 
     SUM(counter) 
FROM (SELECT CASE 
        WHEN m.str LIKE '%APPLE%' 
         THEN 'APPLE' 
        ELSE 'ORANGE' 
       END AS Fruit 
       COUNT(*) AS counter 
      FROM MESA m 
     WHERE m.str LIKE '%FRUIT%' 
      AND (m.str LIKE '%APPLE%' OR m.str LIKE '%ORANGE%') 
     GROUP BY m.str 
    ) 
GROUP BY Fruit 
+0

bạn không thể sử dụng số (*) mà không có nhóm khoản ... (xem lựa chọn nội bộ) – ThinkJet

+0

Cảm ơn câu trả lời Mark. – someone

+0

@ ThinkJet- Xin lỗi, tôi nghĩ rằng tôi đã có một GROUP BY trong nội bộ SELECT –

2

Một biến thể của David Markle câu trả lời:

SELECT 
    fruit_name, 
    count(1) as fruit_count 
FROM (
    SELECT 
    CASE 
     WHEN m.str LIKE '%APPLE%' THEN 'Apple' 
     WHEN m.str LIKE '%ORANGE%' THEN 'Orange' 
    END           as fruit_name 
    FROM 
    MESA m 
    WHERE 
    m.str LIKE '%FRUIT%' 
    AND 
    (m.str LIKE '%APPLE%' OR m.str LIKE '%ORANGE%') 
) 
GROUP BY 
    fruit_name 

Cùng một điều, nhưng chỉ có 1 trường hợp cần thiết, mà đơn giản hoá hỗ trợ ...

+0

Cảm ơn câu trả lời ThinkJet. Nhiều đánh giá cao. – someone

0

tôi sẽ làm điều đó theo cách này - chỉ yêu cầu một thay đổi duy nhất để thêm các loại trái cây bổ sung.

WITH fruits AS (
    SELECT 'APPLE' fruit FROM DUAL 
    UNION ALL 
    SELECT 'ORANGE' fruit FROM DUAL 
) 
SELECT fruit, count(*) 
FROM MESA m, fruits 
WHERE m.str LIKE '%FRUIT%' 
AND m.str LIKE '%' || fruits.fruit || '%' 
GROUP BY fruit 

Nếu chuỗi của bạn là đáng tin cậy trong các định dạng mà bạn thấy trong dữ liệu mẫu của bạn, tôi sẽ xem xét thay đổi vị với một điều kiện, WHERE m.str LIKE 'FRUIT%' || fruits.fruit ||'%'.

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