2012-07-25 65 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