2010-07-21 3 views
10

Oracle SQL을 사용하고 있으며 함수 결과와 같은 여러 행을 그룹화하려고합니다. 예제를 통해 자세히 설명하려면 SQL : 'like'함수의 결과에 따라 '그룹화'할 수 있습니까?


이의 내가 열 중 하나와 테이블 MESA가 있다고 가정하자 큰 문자열입니다. 그리고 내가 행의 수를 계산하고 일치하는 특정 패턴

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

그래서 의이 쿼리의 결과 가정하자입니다

FRUIT..afsafafasfa ... RED_APPLE 20

과일 YELLOW_APPLE ... ..afsafafasfa 12

FRUIT..afsafafasfa ... GREEN_APPLE 3

FRUIT..afsafafasfa ... PURPLE_ORANGE 4

FRUIT..afsafafasfa ... RED_ORANGE 45

는하지만 내 결과이 원하는 :

APPLE (35)

ORANGE 49


이 작업을 수행 할 수 있습니까? 그렇다면, 어떻게 그렇게? :)

댓글 및 코드 스 니펫을 매우 높이 평가합니다.

추 신 : 물론 질문과 결과는 위의 예보다 복잡합니다. 설명하기 쉽도록 간단하게 썼습니다.

건배 ..

+2

그런 문자열은 어떻습니까? 'FRUIT..afsafafasfa ... ORANGE_APPLE'?;) – ThinkJet

+0

예, 좋은 발언입니다. 내 경우에는 그러한 문자열을 가질 가능성이 거의 없습니다. 나는 그것이 순서의 순서에 달려 있다고 생각한다. – someone

답변

11

물론이 같은

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

좋아, 작동, +1 – ThinkJet

+0

Dave 감사. 나는 이것을 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%' 

그 일이겠습니까?

+0

답변 주셔서 감사합니다 JNKyle. 나는 이것에 대해서도 생각해 봤지만 Dave의 대답은 나의 경우에 더 적절하다. (나는 많은 그룹을 만들었으므로) – someone

0

뭔가?

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

그룹핑 절없이 count (*)를 사용할 수 없다 ... (내부 선택을 보라) – ThinkJet

+0

Answer Mark에 감사드립니다. – someone

+0

@ ThinkJet- 죄송합니다. 내부 SELECT에 GROUP BY가 있다고 생각했습니다. –

2

데이비드 마클 응답의 또 다른 변형 : 나는 이런 식으로 할 것이다 지원을 단순화 필요

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 

같은 일이 있지만 1 CASE ...

+0

대답은 ThinkJet에게 감사드립니다. 매우 감사. – someone

0

는 - 필요한 경우에만 과일의 추가 유형을 추가하는 단일 변경. 당신의 문자열이 안정적으로 당신이 당신의 샘플 데이터를 보여 주었다 형식의 경우

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 

, 나는 하나 개의 조건, WHERE m.str LIKE 'FRUIT%' || fruits.fruit ||'%'로 조건을 변경하는 것을 고려한다.

관련 문제