2014-11-21 205 views
0

我正在做一個SQL查詢來試圖找出生產的班次......當我運行這個查詢時,它返回5-FG位置的東西,因爲有一個班次3。這怎麼可能呢?SQL查詢CASE WHEN語句

SELECT * FROM (select pt_desc1, pt_desc2, tr_part, tr_loc, tr_time, case when custpart = '' then   tr_part else custpart end as custpart, sum(tr_qty_loc) as 'Total', 
CASE WHEN tr_loc = '6-LDT2' then 'Dakkota' 
    WHEN tr_loc = '5-FG' then 'Dexsys' end as 'location', 
CASE WHEN tr_time > '14400' AND tr_time < '50400' AND tr_loc = '6-LDT2'Then '1' 
    WHEN tr_time > '50400' AND tr_time < '75600' AND tr_loc = '6-LDT2' Then '2' 
    WHEN tr_time > '75600' OR tr_time < '14400' AND tr_loc = '6-LDT2' Then '3' 
    WHEN tr_time > '21600' AND tr_time < '59400' AND tr_loc = '5-FG' Then '1' 
    WHEN tr_time > '59400' or tr_time < '21600' AND tr_loc = '5-FG' Then '2' end as 'Shift' 
from tr_hist_sql 
join pt_mstr_sql on tr_part = pt_part 
join cp_mstr_sql on pt_part = intpart 
where tr_loc IN ('5-FG') 
and tr_type = 'rct-wo' 
group by tr_part, pt_desc1, pt_desc2, tr_loc, tr_time, case when custpart = '' then tr_part else  custpart end, CASE WHEN tr_time > '14400' AND tr_time < '50400' AND tr_loc = '6-LDT2' Then '1' 
WHEN tr_time > '50400' AND tr_time < '75600' AND tr_loc = '6-LDT2' Then '2' 
WHEN tr_time > '75600' OR tr_time < '14400' AND tr_loc = '6-LDT2' Then '3' 
WHEN tr_time > '21600' AND tr_time < '59400' AND tr_loc = '5-FG' Then '1' 
    WHEN tr_time > '59400' or tr_time < '21600' AND tr_loc = '5-FG' Then '2' end, 
CASE WHEN tr_loc = '6-LDT2' then 'Dakkota' 
    WHEN tr_loc = '5-FG' then 'Dexsys' end 
having sum(tr_qty_loc) > 0) as dt 
where Shift = 1 or shift = 2 or shift =3 

爲了通過tr_part

enter image description here

+4

請不要使用屏幕截圖來溝通代碼和數據。他們很難閱讀,我們必須通過並重新輸入內容來測試響應。複製/粘貼代碼和數據要好得多。 – 2014-11-21 18:01:45

+1

'當tr_time>'75600'或tr_time <'14400''時,突出顯示的記錄清楚地顯示了'tr_time'值爲77530,它大於75600,因此返回3。 – paqogomez 2014-11-21 18:03:18

+0

它也表明tr_loc ='5-FG'的含義不應該是3 – 2014-11-21 18:04:45

回答

1

我的猜測是,線:

WHEN tr_time> '75600' 或tr_time < '14400' 和tr_loc = '-6- LDT2'然後'3'

被解釋爲:

WHEN tr_time> '75600' 或(tr_time < '14400' 和tr_loc = '-6- LDT2')然後 '3'

然後將得出的第一子句:

WHEN tr_time>「75600 '

其中滿足OR語句,給出值'3'。

+0

它只看第一個子句?那第二個AND在那一行呢? – 2014-11-21 18:06:33

+0

那麼基本上把()整個事情呢? – 2014-11-21 18:07:16

+0

我的假設是,它會看到OR子句立即得到滿足,然後跳過它的後半部分。這就是OR語句的工作原理。您只需要聲明的一半來滿足條件,如果立即滿足,則不需要繼續使用第二位。 – ballBreaker 2014-11-21 18:08:04