2013-08-18 3 views
4

오라클을 처음 사용했습니다. 오라클 테이블에 세 개의 열, serialno, item_categoryitem_status이 있습니다. 세 번째 열에서 행은 serviceable, under_repair 또는 condemned의 값을 갖습니다.동일한 열에 다른 값이 표시됩니다.

얼마나 많은 서비스가 가능한지, 몇 개가 수리 중인지, 각 항목 카테고리에 대해 비난되는 횟수를 표시하려면 count를 사용하여 쿼리를 실행하고 싶습니다.

select item_category 
    , count(......) "total" 
    , count (.....) "serviceable" 
    , count(.....)"under_repair" 
    , count(....) "condemned" 
from my_table 
group by item_category ...... 

내가 수를 내부에 내부 쿼리를 실행할 수 없습니다입니다 :

내가 좋아하는 뭔가를 실행하고 싶습니다.

는 여기에 내가 같이 설정 결과를 싶은 내용은 다음과 같습니다

item_category total serviceable  under repair  condemned 
============= ===== ============  ============  =========== 
chair    18  10    5    3 
table    12  6    3    3 

답변

6

이 쿼리 아주 기본적인 "에 의해 그룹"입니다. 검색을하면 plentyofdocumentation이 어떻게 사용되는지 확인할 수 있습니다. 특정 사례를 들어

은, 당신이 원하는 :

item_category item_status count(*) 
====================================== 
Chair   under_repair 7 
Chair   condemned  16 
Table   under_repair 3 

변경 할 수

+0

예 귀하의 접근 방식이 더 나은 해결책입니다. – user75ponic

+1

이 답변을 작성한 이래로 질문은 일부 예제 출력으로 편집되었습니다. 이 대답은 더 이상 적합하지 않습니다. @ 램 블린의 남자가 더 좋아 보인다. –

14

중 하나를 당신의 목적을 위해 필요에 따라 열 순서 :

select item_category, item_status, count(*) 
    from <your table> 
group by item_category, item_status; 

당신은 이런 식으로 뭔가를 얻을 수 있습니다 COUNT 함수 내에서 CASE 또는 DECODE 문을 사용하십시오.

SELECT item_category, 
     COUNT (*) total, 
     COUNT (DECODE (item_status, 'serviceable', 1)) AS serviceable, 
     COUNT (DECODE (item_status, 'under_repair', 1)) AS under_repair, 
     COUNT (DECODE (item_status, 'condemned', 1)) AS condemned 
    FROM mytable 
GROUP BY item_category; 

출력 :

ITEM_CATEGORY TOTAL SERVICEABLE UNDER_REPAIR CONDEMNED 
---------------------------------------------------------------- 
chair   5  1   2    2 
table   5  3   1    1 
+0

그것의 작동 감사 alot – raja

+0

좋은. 그런데, 당신이 클릭하면 (http : // meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work) 답변 옆에있는 체크 표시가 있으면 2 점을 얻습니다. :) – Noel

2

내가 그것을 어떻게 잊을 때, 나는 예를 쉽게 찾을 수 있습니다 writing this stuff까지의 경향이 있습니다.

PIVOT 절은 11g에서 새로 추가되었습니다. 그게 5 년 전 이었으므로, 당신이 그것을 사용하기를 희망합니다.

샘플 데이터

create table t 
(
    serialno number(2,0), 
    item_category varchar2(30), 
    item_status varchar2(20) 
); 

insert into t (serialno, item_category, item_status) 
select 
    rownum serialno, 
    (case 
     when rownum <= 12 then 'table' 
     else 'chair' 
    end) item_category, 
    (case 
     --table status 
     when rownum <= 12 
     and rownum <= 6 
     then 'servicable' 
     when rownum <= 12 
     and rownum between 7 and 9 
     then 'under_repair' 
     when rownum <= 12 
     and rownum > 9 
     then 'condemned' 
     --chair status 
     when rownum > 12 
     and rownum < 13 + 10 
     then 'servicable' 
     when rownum > 12 
     and rownum between 23 and 27 
     then 'under_repair' 
     when rownum > 12 
     and rownum > 27 
     then 'condemned' 
    end) item_status 
from 
    dual connect by level <= 30; 
commit; 

과 PIVOT 쿼리 :

select * 
from 
    (
    select 
     item_status stat, 
     item_category, 
     item_status 
    from t 
) 
pivot 
(
    count(item_status) 
    for stat in ('servicable' as "servicable", 'under_repair' as "under_repair", 'condemned' as "condemned") 
); 

ITEM_CATEGORY servicable under_repair condemned 
------------- ---------- ------------ ---------- 
chair     10   5   3 
table     6   3   3 

난 아직도하지만 (DECODE 대신 CASE를 사용하여 제외) 그 일의 @Ramblin '남자의 방법을 선호합니다.

편집

그냥 내가 총 열을 왼쪽 깨달았다. PIVOT 절을 사용하여 해당 열을 가져올 수있는 방법이 있는지 확신 할 수 없습니다. 아마도 다른 사람이 그 방법을 알고있을 것입니다. 내가 자주 사용하지 않는 이유가 될 수도 있습니다.

관련 문제