2014-05-14 111 views
0

我通過Excel通過ODBC連接訪問SQL和數據庫。這樣我可以創建可刷新的報告。當使用日期between條件時,我使用?,以便我可以在不同日期範圍內經常使用此報告。在SQL中使用日期範圍

問題是,當我使用OR條件時,我最終必須將日期範圍放入4次,或輸入8個不同的日期。有沒有辦法簡化下面的內容,這樣我就不必多次輸入日期了?

Select CFF2X AS TYPE, Count(*) AS COUNT 
FROM ZBP602F.SIH 
JOIN ZBP602UF.NRCMCVL1 ON SICUST=CUSTX 
WHERE SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) and SITOT <> 0 and CFF2X <> (' ') AND  IHOCLS IN (004, 800, 007, 100, 008, 102, 104, 140, 105, 110, 111,109) 
OR SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) and SITOT <> 0 and CFF2X = (' ') AND IHOCLS IN (004, 800, 007, 008, 100, 102, 104, 140, 105, 110, 111) 
OR SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) and SITOT <> 0 AND IHOCLS IN (114) and SIPAY in ('A', 'E') 
OR SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) and SITOT <> 0 AND IHOCLS IN (114) and SIPAY = 'B' and CFF2X <> (' ') 
Group by CFF2X 

回答

1
WHERE SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) AND SITOT <> 0 
AND (
     (CFF2X <> ' ' AND 
     IHOCLS IN (004, 800, 007, 100, 008, 102, 104, 140, 105, 110, 111,109) 
     ) 
    OR (CFF2X = ' ' AND 
     IHOCLS IN (004, 800, 007, 008, 100, 102, 104, 140, 105, 110, 111) 
     ) 
    OR (IHOCLS = 114 and SIPAY in ('A', 'E')) 
    OR (IHOCLS = 114 and SIPAY = 'B' and CFF2X <> ' ') 
) 

你乾脆把不變的物品一次,然後把改變位爲一對夫婦的OR語句。像這樣簡化布爾邏輯的過程稱爲邏輯縮減(想想卡諾圖)。您還可以在此處執行其他優化。

+0

神奇,它的工作!非常感謝!我在學校中瞭解了一點,但在今天的現實世界工作環境中,我還沒有嘗試過。很高興知道! – SQUISH

+1

不客氣。不要忘記接受答案,如果它幫助你... – Baldy

+0

我該怎麼做? :P – SQUISH

1

我會嘗試使用一些括號來防止重複性。

如果更改WHERE喜歡的東西:

WHERE (SIINVD BETWEEN ? AND ? AND SICOMP IN (01, 03, 06) and SITOT <> 0) AND 
    (
    (CFF2X <> (' ') AND IHOCLS IN (004, 800, 007, 100, 008, 102, 104, 140, 105, 110, 111,109)) OR 
    (CFF2X = (' ') AND IHOCLS IN (004, 800, 007, 008, 100, 102, 104, 140, 105, 110, 111)) OR 
    (IHOCLS IN (114) and SIPAY in ('A', 'E')) OR 
    (IHOCLS IN (114) and SIPAY = 'B' and CFF2X <> (' ')) 
) 
; 

這將檢查SIINVD,SICOMP和SITOT所有記錄第一是它是所有相同的查詢。然後4個不同的案例將被匹配。由於缺少括號,當前的查詢可能實際上不會實現您的想法。

+0

非常感謝你的快速幫助。 – SQUISH

+0

@SQUISH如果這個答案解決了你的問題,那麼就不要離開閱讀[**接受答案:它是如何工作的?**](http://meta.stackexchange.com/questions/5234/how-does- 5235#5235) –

+0

我明白了,我只能接受一個答案,即使多個答案都很好:(..對不起傑夫。 – SQUISH