2012-07-25 66 views
2

我会尽力,尽我所能形容SQL嵌套的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

+0

你能介绍一下你期望的结果吗? – 2012-07-25 18:43:58

+0

你可以发布你到目前为止? – 2012-07-25 18:44:18

+0

现在你有一个交叉连接。那是你想要的吗?无论如何您都不应该使用隐式连接,因为它们可以很容易地导致无意的交叉连接和其他不良情况。 IMplicit连接是SQl反模式,真的没有理由继续使用它们。 – HLGEM 2012-07-25 18:53:57

回答

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

一般来说,当你需要不同的数,您需要使用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)-----> (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