2012-07-25 3 views
2

COUNT()와 문하지만, 내가 그것을 말할 것도 설명이 문제를 해결 내 모든 머리를 정리하기가 어렵습니다 ....SQL 중첩 된 선택 나는 최선 내가 할 수있는 설명하려고합니다

내가 노력하고 있어요 하나의 쿼리에서 여러 결과를 선택하여 데이터베이스의 현재 상태를 표시합니다. 레코드의 한 유형으로 첫 번째 열이 있고 첫 번째 열의 하위 범주로 두 번째 열이 있습니다. 하위 카테고리는 그 아래의 더 많은 레코드 (상태로 구별 됨)에 링크되어 더 많은 열을 형성합니다. 모든 주요 카테고리/하위 카테고리 조합을 표시 한 다음 하위 카테고리의 하위에 하위 하위 카테고리가 몇 개인지를 표시해야합니다. 고유 한 조합을 표시 할 수 있도록 가져 왔으므로 SELECT 문을 중첩하는 방법을 모르므로 기본 쿼리와 완전히 다른 테이블의 수를 선택할 수 있습니다. 내 문제는 주 카테고리와 하위 카테고리를 표시하기 위해 하나의 테이블에서 가져올 수 있지만 다른 테이블에서 계산해야합니다. 문제에 대한 아이디어는 크게 평가 될 것입니다.

여기에 제가 가지고있는 것들이 있습니다. 카운트 문은 각 상태의 수로 대체 될 것이다 : 여기

SELECT wave_num "WAVE NUMBER", 
    int_tasktype "INT/TaskType", 
    COUNT (1) total, 
    COUNT (1) "LOCKED/DISABLED", 
    COUNT (1) released, 
    COUNT (1) "PARTIALLY ASSEMBLED", 
    COUNT (1) assembled 
FROM (SELECT DISTINCT 
      (t.invn_need_type || '/' || s.code_desc) int_tasktype, 
      t.task_genrtn_ref_nbr wave_num 
     FROM sys_code s, task_hdr t 
     WHERE  t.task_genrtn_ref_nbr IN 
        (SELECT ship_wave_nbr 
         FROM ship_wave_parm 
         WHERE TRUNC (create_date_time) LIKE SYSDATE - 7) 
      AND s.code_type = '590' 
      AND s.rec_type = 'S' 
      AND s.code_id = t.task_type), 
    ship_wave_parm swp 
GROUP BY wave_num, int_tasktype 
ORDER BY wave_num 

이미지 : 서로 다른 수를 필요로 할 때 http://i.imgur.com/JX334.png

+0

예상대로 결과를 표시 할 수 있습니까? –

+0

지금까지 가지고있는 것을 게시 할 수 있습니까? –

+0

지금은 크로스 조인이 있습니다. 그게 니가 원하는거야? 어쨌든 의도하지 않은 교차 ​​결합 및 기타 나쁜 점을 쉽게 가져올 수 있으므로 암시 적 조인을 사용하지 않아야합니다. IMplicit 조인은 SQl 반 패턴이며 여전히 사용하기위한 변명의 여지가 없습니다. – HLGEM

답변

2

가 문제 및 Oracle에 대해 모두 약간의 추측 (나는 한 - 불행하게도 - 사용되지 않습니다)는, 잘하면 그것은 당신에게 몇 가지 아이디어를 줄 것이다. 완전히 당신은 SQL을 작성하는 방법을 엉망으로 들어 SELECT 죄송합니다 ... FROM (SELECT ... WHERE ... IN (SELECT ...)) 단순히 나를 혼란, 그래서 구조 조정에 있습니다

with tmp(int_tasktype, wave_num) as 
(select distinct (t.invn_need_type || '/' || s.code_desc), t.task_genrtn_ref_nbr 
from sys_code s 
join task_hdr t 
    on s.code_id = t.task_type 
where s.code_type = '590' 
    and s.rec_type = 'S' 
    and exists(select 1 from ship_wave_parm p 
       where t.task_genrtn_ref_nbr = p.ship_wave_nbr 
       and trunc(p.create_date_time) = sysdate - 7)) 

select t.wave_num "WAVE NUMBER", t.int_tasktype "INT/TaskType", 
     count(*) TOTAL, 
     sum(case when sst.sub_status = 'LOCKED' then 1 end) "LOCKED/DISABLED", 
     sum(case when sst.sub_status = 'RELEASED' then 1 end) RELEASED, 
     sum(case when sst.sub_status = 'PARTIAL' then 1 end) "PARTIALLY ASSEMBLED", 
     sum(case when sst.sub_status = 'ASSEMBLED' then 1 end) ASSEMBLED 
from tmp t 
join sub_status_table sst 
    on t.wave_num = sst.wave_num 
group by t.wave_num, t.int_tasktype 
order by t.wave_num 

보시다시피, 나는 substatuses 테이블에 대해 아무것도 몰라요.

-1

는 일반적으로, 당신은 CASE의 한 Statment를 사용해야합니다.

select count(*) as total 
    , case when field1 = "test' then 1 else 0 end as testcount 
    , case when field2 = 'yes' then 1 else 0 endas field2count 
FROM table1 
1

당신은 당신의 결과를 얻기 위해, 내부 조인을 사용 그룹화 및 셀 수 : 가정 해 테이블은 다음과 같습니다 : 고양이 (1) ---> (N) subcat (1) -----> subcat_detail. 때문에 쿼리는 다음과 같습니다

select cat.title cat_title ,subcat.title subcat_title ,count(*) as cnt from 
cat inner join sub_cat on cat.id=subcat.cat_id 
inner join subcat_detail on subcat.ID=am.subcat_detail_id 
group by cat.title,subcat.title 
관련 문제