Sql 复杂查询-IF-ELSE或CASE或两者兼有(复制ETL过程的一部分)
不确定如何进行此查询(此查询的目的是复制ETL过程的一部分,从而验证它): 当Sql 复杂查询-IF-ELSE或CASE或两者兼有(复制ETL过程的一部分),sql,sql-server,Sql,Sql Server,不确定如何进行此查询(此查询的目的是复制ETL过程的一部分,从而验证它): 当票据类型=C或M和付款人类型=C(客户)或S(子公司)或T(第三方) 付款人类型定义如下: 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
票据类型=C或M
和付款人类型=C(客户)或S(子公司)或T(第三方)
付款人类型定义如下:
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')
然后事务代码=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 = ''
选择案例账单类型
那么“C”是什么时候
(案例
当DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO DBO.SRC_HBM_MATTER.CLIENT_UNO
案例DBO.SRC\u TBM\u事项
当0时,则为
当我没有
结束
当DBO.SRC\u BLT\u BILLP.PAYR\u CLIENT\u UNO=DBO.SRC\u HBM\u MATTER.CLIENT\u UNO时,则为“C”
(完)
我什么时候来
(案例
当DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO DBO.SRC_HBM_MATTER.CLIENT_UNO
案例DBO.SRC\u TBM\u事项
当0时,则为
当我没有
结束
当DBO.SRC\u BLT\u BILLP.PAYR\u CLIENT\u UNO=DBO.SRC\u HBM\u MATTER.CLIENT\u UNO时,则为“C”
(完)
以TRANS_代码结尾
来自DBO.SRC_BLT_BILL,DBO.SRC_HBM_MATTER,DBO.SRC_TBM_MATTER,DBO.SRC_BLT_BILL
其中_HS_CNTYPE=''
我认为两者都不是。当我看到“如果”或“案例”时,我认为是“程序性的”。SQL在基于集合和声明的情况下工作得最好
除非这是一个存储过程,否则我会对其进行返工以消除“if”和“case”。只是我的意见
如果每种账单和播放器类型都有不同的数据集,也许您可以将它们作为视图访问,并从查询中消除这种逻辑。对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
选择案例
当BILL_输入('C','M'),然后
案例
当DBO.SRC_BLT_BILLP.PAYR_CLIENT_UNO DBO.SRC_HBM_MATTER.CLIENT_UNO
案例DBO.SRC\u TBM\u事项
当0时,则为
当我没有
结束
当DBO.SRC\u BLT\u BILLP.PAYR\u CLIENT\u UNO=DBO.SRC\u HBM\u MATTER.CLIENT\u UNO时,则为“C”
结束
以TRANS_代码结尾
…这不是SP,而是用于重新复制ETL过程一部分的查询的一部分。更新描述以澄清问题。似乎是一个相当直截了当的案例条款,尽管更多信息(如查询/更新的其余部分)会有所帮助。我已经更新了问题,我认为这应该是案例陈述的基础。如果您认为这是错误的,请纠正我。该查询看起来确实是错误的-它会将SRC_BLT_BILLP上的每个记录与SRC_HBM_MATTER上具有不匹配CLIENT_UNO值的每个记录相链接,然后将结果与SRC_TBM_MATTER中的所有记录合并,其中_HS_3PTY为0。看起来应该使用其他字段来链接这些表。你能包括被查询表的结构吗?用我的查询尝试更新了我的问题,该查询的部分成功确实有效。任何输入都可以在同一案例查询行中指定以下内容。选择CASE WHEN(账单输入('C','M')和_HS_CNTYPE='')
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