2011-04-19 70 views
1

喂, 我的目標是產生一個表中顯示了總屬於業主的每個代碼,請注意每個業主必須有代碼依賴於它,不管總價值是零。所以會有APP,REJ,CAN綁定到每個APPROVAL_ID。爲什麼外連接查詢不起作用?

APPROVAL_ID CODE TOTAL 
----------- ---- ----- 
101   APP 2 
101   REJ 1 
101   CAN 3 
102   APP 2 
102   REJ 4 
102   CAN 0 
103   APP 0 
103   REJ 0 
103   CAN 4 

因此,這裏是源代碼:

select approval_id, code, total 
from (
    select 'APP' code, '1' seq from dual 
    union all 
    select 'REJ' code, '2' seq from dual 
    union all 
    select 'CAN' code, '3' seq from dual 
) 
left outer join (
     select m.approval_id, own.name, m.decision, count(*) total, 
     case own.channel 
      when 'CH1' then 'CH1' 
      when 'CH2' then 'CH2' 
      else 'Others Channel' 
     end the_channel 
     from tableM m, owner own 
     where m.decision in ('REJ', 'APP', 'CAN') 
     and own.id=m.approval_id 
     group by m.approval_id, own.name, m.decision, own.channel 
     order by m.approval_id 
) 
on code=decision 
group by approval_id, code, total 
order by approval_id; 

從上述查詢的輸出是象下面這樣:

APPROVAL_ID CODE TOTAL 
----------- ---- ----- 
101   APP 2 
101   REJ 1 
101   CAN 3 
102   APP 2 
102   REJ 4 
103   CAN 4 

內部查詢的輸出是象下面這樣:

APPROVAL_ID CODE TOTAL 
----------- ---- ----- 
101   APP 2 
101   REJ 1 
101   CAN 3 
102   APP 2 
102   REJ 4 
103   CAN 4 

東西W¯¯因爲我知道某些行的總值爲零,所以應該在其中打印類似(空)值的東西。但爲什麼它隱藏在視圖中?我的查詢有什麼不對嗎?

THanks @!

+0

什麼是內部查詢的回報? (選擇m.approval_id,own.name,m.decision,count(*)total,case own.channel'CH1',然後'CH1'當'CH2'時'CH2'else'其他頻道'結束tableM的the_channel m ,所有者自己在m.decision中('REJ','APP','CAN')和own.id = m.approval_id組中通過m.approval_id,staff.staff_name,m.decision,own.channel order by m。 approval_id) – forsvarir 2011-04-19 08:21:13

+0

@forsvarir我已經添加了內部查詢的輸出。它與父母的產出完全一樣。 – huahsin68 2011-04-19 08:49:29

+0

whats staff.staff_name在內部查詢中? – 2011-04-19 09:03:19

回答

1

首先,你需要做你的老闆和你的碼錶之間的交叉連接。 然後你做左連接。

我已經modelised 3表:型號爲您3線APP,REJ和CAN,然後用戶表,相當於你的主表和第三個表決定,相當於你tableM。

查詢看起來是這樣的:

SELECT c.user_id, c.type_code, COUNT(d.id) 
FROM 
(

    SELECT t.ID as type_id, u.id as user_id, t.CODE as type_code 
    FROM Type t, Userr u 
) c 
    LEFT OUTER JOIN Decision d 
      ON d.user_id = c.user_id 
      AND d.type_id = c.type_id 
GROUP BY c.user_id, c.type_code 

未經測試,但對於集合表你:

select a.id_own, a.code, count(m.approval_id) 
from 
    (
     select code, own.id as id_own 
     from (
      select 'APP' code, '1' seq from dual 
      union all 
      select 'REJ' code, '2' seq from dual 
      union all 
      select 'CAN' code, '3' seq from dual 
     ) , owner own 
    ) a 
    left outer join tableM m 
on a.code = m.decision 
and a.id_own = m.approval_id 
group by a.id_own, a.code 
order by a.id_own 

注意,計數(m.approval_id)會給你approval_id的數在左連接中不顯示爲空。

+0

你的算法非常完美!我從你身上學到了新技術:0) – huahsin68 2011-04-19 09:49:15

1

你的外部聯接是代碼=決定。這意味着您會得到每行代碼的一行,這不會作爲右側的決策出現。很明顯,您想要通過3個代碼的交叉連接和所有不同的APPROVAL_ID進行左連接,在左邊給出代碼和APPROVAL_ID的所有組合。

0

我的第一個猜測是,

group by approval_id, code, total 

應該

group by approval_id, code