Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 复杂查询-IF-ELSE或CASE或两者兼有(复制ETL过程的一部分)_Sql_Sql Server - Fatal编程技术网

Sql 复杂查询-IF-ELSE或CASE或两者兼有(复制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

不确定如何进行此查询(此查询的目的是复制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 <> 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