Sql server T-SQL准备动态合并

Sql server T-SQL准备动态合并,sql-server,coalesce,Sql Server,Coalesce,如屏幕截图所示,有两张表 配置: 细节 使用Configuration和Detail表,我想在Detail表中填充IdentificationType和ideriveIdentification列 在推导上述列时,应使用以下逻辑 配置表格具有优先顺序,用户可以动态更改优先顺序(即,如果国家为奥地利,则ID优先顺序应为LEI,然后为TIN(如果LEI为空白),然后为CONCAT(如果两者均为空白,则为其他逻辑) 如果合同ID=3,则国家为BG,因此应首先检查LEI,因为其为空,将选择CCPT=4

如屏幕截图所示,有两张表

  • 配置
  • 细节
  • 使用
    Configuration
    Detail
    表,我想在
    Detail
    表中填充
    IdentificationType
    ideriveIdentification

    在推导上述列时,应使用以下逻辑

  • 配置
    表格具有优先顺序,用户可以动态更改优先顺序(即,如果国家为
    奥地利
    ,则ID优先顺序应为LEI,然后为TIN(如果LEI为空白),然后为CONCAT(如果两者均为空白,则为其他逻辑)

  • 如果合同ID=3,则国家为BG,因此应首先检查LEI,因为其为空,将选择CCPT=456

  • 如果允许硬编码,我可以使用
    COALESCE
    CASE
    语句

    你能建议一下其他的方法吗

    问候


    Digant

    假设这是一个可怕的数据转储,而您正试图清理它,那么就需要一些SQL来处理它了。:)首先,我能够通过Adobe Acrobat>Excel捕获您的图像文本

    (我还在以下位置为您构建了模式:)

    首先,正确的做法是修复这个突出的问题,这就是表结构。假设你不能,这里有一个解决方案

    因此,在这里,它所做的是从detail表中取消PIVOTS列LEI、NIND、CCPT和TIN,以及从Configuration表中取消FirstPref、SecondPref、ThirdPref。基本上,这样做有助于规范化数据,尽管如果没有计划修复数据结构或无法修复数据结构,这会降低您的主要性能。之后,您只需将表
    Detail.ContactId
    连接到
    DerivedTypes.ContactId
    然后
    DerivedPrefs.ISOCountryCode
    连接到
    Detail.CountrySoCountryCode
    DerivedTypes.ldIdentificationType=DerivedPrefs.ldIdentificationType
    如果使用内部连接而不是左连接,则可以删除
    RANK()
    函数,但它不会显示所有ContactID,仅显示在LEI、NIND、CCPT或TIN列中有值的ContactID。我认为这是一个更好的解决方案,因为为什么您希望在报告中混合出现错误?为那些列中没有值的列编写单独的报告。最后,带领带的
    顶部(1)允许您为每个ContactId显示一条记录,并允许仍显示有错误的记录。希望这有帮助

    CREATE TABLE Configuration
        (ISOCountryCode varchar(2), CountryName varchar(8), FirstPref varchar(6), SecondPref varchar(6), ThirdPref varchar(6))
    ;
    
    INSERT INTO Configuration
        (ISOCountryCode, CountryName, FirstPref, SecondPref, ThirdPref)
    VALUES
        ('AT', 'Austria', 'LEI', 'TIN', 'CONCAT'),
        ('BE', 'Belgium', 'LEI', 'NIND', 'CONCAT'),
        ('BG', 'Bulgaria', 'LEI', 'CCPT', 'CONCAT'),
        ('CY', 'Cyprus', 'LEI', 'NIND', 'CONCAT')
    ;
    
    
    CREATE TABLE Detail
        (ContactId int, FirstName varchar(1), LastName varchar(3), BirthDate varchar(4), CountrylSOCountryCode varchar(2), Nationality varchar(2), LEI varchar(9), NIND varchar(9), CCPT varchar(9), TIN varchar(9))
    ;
    
    INSERT INTO Detail
        (ContactId, FirstName, LastName, BirthDate, CountrylSOCountryCode, Nationality, LEI, NIND, CCPT, TIN)
    VALUES
        (1, 'A', 'DES', NULL, 'AT', 'AT', '123', '4345', NULL, NULL),
        (2, 'B', 'DEG', NULL, 'BE', 'BE', NULL, '890', NULL, NULL),
        (3, 'C', 'DEH', NULL, 'BG', 'BG', NULL, '123', '456', NULL),
        (4, 'D', 'DEi', NULL, 'BG', 'BG', NULL, NULL, NULL, NULL)
    ;
    
    
    SELECT TOP (1) with ties Detail.ContactId,
        FirstName,
        LastName,
        BirthDate,
        CountrylSOCountryCode,
        Nationality, 
        LEI, 
        NIND, 
        CCPT, 
        TIN, 
        ISNULL(DerivedPrefs.ldentificationType, 'ERROR') ldentificationType,
        IDerivedIdentification,
        RANK() OVER (PARTITION BY Detail.ContactId ORDER BY 
                        CASE WHEN Pref = 'FirstPref' THEN 1
                        WHEN Pref = 'SecondPref' THEN 2
                        WHEN Pref = 'ThirdPref' THEN 3
                        ELSE 99 END) AS PrefRank
    
    FROM 
        Detail
    LEFT JOIN   
    (
        SELECT 
            ContactId, 
            LEI, 
            NIND,
            CCPT,
            TIN
        FROM Detail 
    ) DetailUNPVT
    UNPIVOT
        (IDerivedIdentification FOR ldentificationType IN
            (LEI, NIND, CCPT, TIN)
        )AS DerivedTypes
    ON DerivedTypes.ContactId = Detail.ContactId
    
    LEFT JOIN 
    (
        SELECT
            ISOCountryCode, 
            CountryName, 
            FirstPref, 
            SecondPref, 
            ThirdPref
        FROM
            Configuration
    ) ConfigUNPIVOT
    UNPIVOT
        (ldentificationType FOR Pref IN
            (FirstPref, SecondPref, ThirdPref)
        )AS DerivedPrefs
    ON DerivedPrefs.ISOCountryCode = Detail.CountrylSOCountryCode
    and DerivedTypes.ldentificationType = DerivedPrefs.ldentificationType
    
    
    ORDER BY RANK() OVER (PARTITION BY Detail.ContactId ORDER BY 
                        CASE WHEN Pref = 'FirstPref' THEN 1
                        WHEN Pref = 'SecondPref' THEN 2
                        WHEN Pref = 'ThirdPref' THEN 3
                        ELSE 99 END)
    

    您的尝试是什么?我仍然不确定方法(动态Sql或其他)而不是解决方案。