2011-08-04 3 views
1

다른 범위의 값 개수를 얻기 위해 쿼리를 작성하려고합니다.Oracle Bucketing Values ​​

내 테이블에 'Name'이라는 열과 'Value'라는 숫자가있는 열이 있다고 가정 해 보겠습니다.

현재 내가 쿼리 나에게 결과를 제공하지만, SLOW veeeeeerrrrry을 수행 할 것

select count(1) from table where value between 1 and 10 
union all 
select count(1) from table where value between 11 and 80 
union all 
select count(1) from table where value between 81 and 100. 

같은 쿼리를 쓰고 1에서 100

에 값을 취할 수 '값'열.

더 좋은 방법이 있나요?

'값'열의 값을 기반으로 테이블을 분할 할 수 없다는 점을 기억하십시오. 다른 열도 마찬가지로 있습니다.

편집

난 당신이 세 개의 열 또는 1 세 행 한 행을 얻을 수 있는지 여부 상관 없어 가정, 첫 번째 쿼리의

select count(distinct names) from table where value between 1 and 10 
union all 
select count(distinct names) from table where value between 11 and 80 
union all 
select count(distinct names) from table where value between 81 and 100. 

답변

2

에 위의 쿼리를 수정 하겠어 확인 열, 당신은 당신이 그것을 세 번 스캔보다 한 번이 아니라 테이블을 스캔하게됩니다

SELECT SUM(CASE WHEN value BETWEEN 1 AND 10 
       THEN 1 
       ELSE 0 
      END) num_between_1_and_10, 
     SUM(CASE WHEN value BETWEEN 11 AND 80 
       THEN 1 
       ELSE 0 
      END) num_between_11_and_80, 
     SUM(CASE WHEN value BETWEEN 81 AND 100 
       THEN 1 
       ELSE 0 
      END) num_between_81_and_100 
    FROM table_name 

뭔가를 할 수 있습니다.

두 번째 쿼리는 일반적으로 다른 결과 집합을 반환합니다. 두 번째 검색어와 다른 검색어를 일치시킬 수 있습니다.

SELECT COUNT(DISTINCT(CASE WHEN value BETWEEN 1 AND 10 
          THEN name 
          ELSE null 
         END)) num_distinct_between_1_and_10, 
     COUNT(DISTINCT(CASE WHEN value BETWEEN 11 AND 80 
          THEN name 
          ELSE null 
         END)) num_distinct_between_11_and_80, 
     COUNT(DISTINCT(CASE WHEN value BETWEEN 81 AND 100 
          THEN name 
          ELSE null 
         END)) num_distinct_between_81_and_100 
    FROM table_name 
+0

좋지만 좋지는 않습니다. –

+0

@Anand - "충분하지 않다"는 것이 구체적으로 무엇을 의미하는지 설명 할 수 있습니까? 결과가 당신이 찾고있는 것과 다르지 않습니까? 그렇다면 쿼리가 무엇인지 또는 올바르게 반환되지 않는지에 대한 세부 정보를 제공 할 수 있습니까? –

+0

뚜렷한 내 쿼리를 수정했습니다 –

관련 문제