2014-05-14 157 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