不确定如何应用此查询(此查询的目的是复制ETL过程的一部分,从而验证它):
当bill_type = C or M
和payer type = C (client) or S (Subsidiary) or T (third party)
付款人类型定义如下:
If BLT_BILLP.PAYR_CLIENT_UNO <> HBM_MATTER.CLIENT_UNO for Lead Matter
and TBM_MATTER._HS_3PTY = 0 Then value = S ('Subsidiary')
If BLT_BILLP.PAYR_CLIENT_UNO <> HBM_MATTER.CLIENT_UNO for Lead Matter
and TBM_MATTER._HS_3PTY = 1 Then value = T ('Third Party')
If BLT_BILLP.PAYR_CLIENT_UNO = HBM_MATTER.CLIENT_UNO for Lead Matter
Then value = C ( 'Client')
和
BLT_BILL._HS_CNTYPE = blank
然后交易代码= BC或BS或BT。
案例查询最好:
SELECT CASE BILL_TYPE
WHEN 'C' THEN 'BC'
END
FROM DBO.SRC_BLT.BILL
以下是我尝试创建查询,是否有更好的方法:
SELECT CASE BILL_TYPE
WHEN 'C' THEN
(CASE
WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO <> DBO.SRC_HBM_MATTER.CLIENT_UNO THEN
CASE DBO.SRC_TBM_MATTER._HS_3PTY
WHEN 0 then 'S'
WHEN 1 then 'T'
END
WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO = DBO.SRC_HBM_MATTER.CLIENT_UNO THEN 'C'
END)
WHEN 'M' THEN
(CASE
WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO <> DBO.SRC_HBM_MATTER.CLIENT_UNO THEN
CASE DBO.SRC_TBM_MATTER._HS_3PTY
WHEN 0 then 'S'
WHEN 1 then 'T'
END
WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO = DBO.SRC_HBM_MATTER.CLIENT_UNO THEN 'C'
END)
END AS TRANS_CODE
FROM DBO.SRC_BLT_BILLP, DBO.SRC_HBM_MATTER, DBO.SRC_TBM_MATTER, DBO.SRC_BLT_BILL
AND WHERE _HS_CNTYPE = ''
答案 0 :(得分:1)
我不会说。当我看到“if”或“case”时,我认为是“程序性的”。当它基于集合和声明时,SQL效果最好。
除非这是一个存储过程,否则我会重做这个以消除“if”和“case”。只是我的意见。
如果每个帐单和播放器类型都有不同的数据集,您可以将它们作为视图访问,并从查询中消除此逻辑。
答案 1 :(得分:1)
对CASE条款稍微干一些的方法:
SELECT CASE
WHEN BILL_TYPE IN ('C','M') THEN
CASE
WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO <> DBO.SRC_HBM_MATTER.CLIENT_UNO THEN
CASE DBO.SRC_TBM_MATTER._HS_3PTY
WHEN 0 then 'S'
WHEN 1 then 'T'
END
WHEN DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO = DBO.SRC_HBM_MATTER.CLIENT_UNO THEN 'C'
END
END AS TRANS_CODE
...