带有COUNT()的SQL嵌套Select语句

时间:2012-07-25 18:42:24

标签: sql oracle count

我会尽力描述,但是我很难全心全意地解决这个问题,更不用说描述它了....

我试图在一个查询中选择多个结果以显示数据库的当前状态。我将第一列作为一种记录类型,将第二列作为第一列的子类别。然后将子类别链接到其下的更多记录,按状态区分,形成多个列。我需要显示每个主要类别/子类别组合,然后显示后续列中该子类别下面每个子状态的数量。我已经得到它,以便我可以显示唯一的组合,但我不知道如何嵌套select语句,以便我可以从主查询中选择一个完全不同的表的计数。我的问题在于,要显示主类别和子类别,我可以从一个表中提取,但我需要从另一个表中计算。任何有关此事的想法都将受到高度赞赏

这就是我所拥有的。 count语句将替换为每个状态的计数:

  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

3 个答案:

答案 0 :(得分:2)

猜测一下,关于你的问题和甲骨文(我很遗憾 - 从未使用过),希望它会给你一些想法。抱歉完全弄乱你编写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

正如您所注意到的那样,我对子表的表格一无所知。

答案 1 :(得分:1)

您可以使用内部联接,分组和计数来获得结果: 表格如下: cat(1)--->(n)subcat(1)----->(n)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

答案 2 :(得分:-1)

通常,当您需要不同的计数时,需要使用CASE语句。

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