2013-07-25 50 views
0

在每個模數中,我想從類列中選擇最差的類值,但只能從y/n列中的'y'行中選擇最差的類值,然後我想在每個類中填充此類行爲每個模。我不知道如何實現層次是:選擇分區(層次結構)中的最差值

N是爲O更好,O是除P較好,P大於W更好,W比S(S是班級最差的)

例更好:

modulo y/n class 
1   y  N 
1   n  P 
1   n  W 
1   y  P 
2   n  W 
2   n  N 
3   y  P 
3   y  W 
3   n  O 
2   y  W 
4   n  P 
4   y  S 

,我想什麼來實現:

modulo y/n class worst_class 
1   y  N  W 
1   n  P  W 
1   n  W  W 
1   y  P  W 
2   n  W 
2   n  N 
3   y  P  S 
3   y  S  S 
3   n  O  S 
1   y  W  W 
4   n  S  P 
4   y  P  P 

在模 '1' 只有三個與 'Y' 值:N,P和W的最差值是W,所以在模數'1'中爲每一行填充W.在'2'模中沒有'y'那麼NULL的行,在模3中有兩個值'y':P和S.最壞的是S.在模4中只有P和'你會在每一行填充P.

回答

2

下面的查詢獲取你想要的查詢內容:

select m.*, mm.WorstClass 
from modulo m left outer join 
    (select modulo, 
      (case when SUM(case when class = 'S' then 1 else 0 end) > 0 then 'S' 
        when sum(case when class = 'W' then 1 else 0 end) > 0 then 'W' 
        when sum(case when class = 'P' then 1 else 0 end) > 0 then 'P' 
        when sum(case when class = 'O' then 1 else 0 end) > 0 then 'O' 
        when sum(case when class = 'N' then 1 else 0 end) > 0 then 'N' 
       end) as WorstClass 
     from modulo 
     where YN = 'y' 
     group by modulo 
    ) mm 
    on m.modulo = mm.modulo; 

因爲這是甲骨文的更新,需要使用相關子查詢:

update modulo m 
    set WorstClass = 
     (select (case when SUM(case when class = 'S' then 1 else 0 end) > 0 then 'S' 
        when sum(case when class = 'W' then 1 else 0 end) > 0 then 'W' 
        when sum(case when class = 'P' then 1 else 0 end) > 0 then 'P' 
        when sum(case when class = 'O' then 1 else 0 end) > 0 then 'O' 
        when sum(case when class = 'N' then 1 else 0 end) > 0 then 'N' 
       end) as WorstClass 
     from modulo mm 
     where YN = 'y' and mm.module = m.modulo 
    ) 

這假定你有一列最差的班級。如果你沒有,那麼你需要添加一個使用alter table

+0

我不知道最新錯誤,但我不斷收到:「缺少右括號」所有的時間http://sqlfiddle.com/#!4/641dd/2 –

+0

@FrankMoses。 。 。我很抱歉。不知何故,我讀MySQL作爲數據庫。我修復了Oracle語法的答案。 –

+0

現在它像一個魅力。謝謝 –