SQL CASE构造问题

时间:2017-10-17 15:58:20

标签: sql-server

我正在尝试通过针对一组业务规则运行它们来为发票分配交易类型以进行确定。该数据库包含发票标题表(SOP10100),发票行(SOP10200)和我们的项目表(IV00101)。其他条件在Header级别(CUST#)得到满足,其他条件要求我测试特定发票中的任何行项目是否包含某个ItemClassCode(来自Items表)。最后,如果没有满足任何条件,则使用“无交易类型”代码。

在测试中,我有一些发票满足前3个案例,有些满足第5个('456'),没有满足第4个('123'),有些满足任何条件。除了那些不符合标准的人之外,结果对所有人都很好。这些记录不属于ELSE,而是给出了'456'。

我想我明白发生了什么。 WHEN语句中的查询不会与当前的Invoice标头记录一起运行....它正在与所有Invoice标头一起运行。

我是否理解这一点,任何人都可以帮忙吗?

由于

 SELECT DISTINCT
    OH.SOPNUMBE SOPMNBR,
    OH.ORDRDATE ORDERDATE,
    OH.ORIGNUMB ORIGNUM,
    OH.CUSTNMBR CUSTOMER,
    OH.INVODATE,
    CASE    WHEN OH.CUSTNMBR = 'CUST1' THEN 'First'
            WHEN OH.CUSTNMBR = 'CUST2' THEN 'Second'
            WHEN OH.CUSTNMBR = 'CUST3' THEN 'Third'
            WHEN EXISTS (SELECT OH.SOPNUMBE,
                                OL.SOPNUMBE,
                                IV.ITEMNMBR,
                                IV.ITMCLSCD
                        FROM SOP10100 OH
                        INNER JOIN SOP10200 OL ON OH.SOPNUMBE = OL.SOPNUMBE
                        INNER JOIN IV00101 IV ON OL.ITEMNMBR = IV.ITEMNMBR
                        WHERE LEFT(IV.ITMCLSCD,3)='123'
                        AND OH.SOPTYPE=3
                        AND OH.PSTGSTUS = 0
                        AND OH.VOIDSTTS = 0
                        AND OH.BACHNUMB <>'DO NOT POST') THEN '123'
            WHEN EXISTS (SELECT OH.SOPNUMBE,
                                OL.SOPNUMBE,
                                IV.ITEMNMBR,
                                IV.ITMCLSCD
                        FROM SOP10100 OH
                        INNER JOIN SOP10200 OL ON OH.SOPNUMBE = OL.SOPNUMBE
                        INNER JOIN IV00101 IV ON OL.ITEMNMBR = IV.ITEMNMBR
                        WHERE IV.ITMCLSCD = '456'
                        AND OH.SOPTYPE=3
                        AND OH.PSTGSTUS = 0
                        AND OH.VOIDSTTS = 0
                        AND OH.BACHNUMB <>'DO NOT POST') THEN '456'
            ELSE 'NO TRANSACTION TYPE' 
    END  TRANSTYPE
FROM SOP10100 OH 
INNER JOIN SOP10200 OL ON OH.SOPNUMBE = OL.SOPNUMBE
INNER JOIN IV00101 IV ON OL.ITEMNMBR = IV.ITEMNMBR
WHERE OH.SOPTYPE=3
AND OL.SOPNUMBE = OH.SOPNUMBE 
AND OH.PSTGSTUS = 0
AND OH.VOIDSTTS = 0
AND OH.BACHNUMB <>'DO NOT POST'

0 个答案:

没有答案