2017-12-16 3 views
-1

Wie im Screenshot angefügt, gibt es zwei Tabellen.T-SQL vorbereiten dynamische COALESCE

  1. Konfiguration:

enter image description here

  1. Details

Mit Configuration und Detail Tabelle Ich möchteaufzufüllenund IDerivedIdentification Spalte in der Detail Tabelle.

Der Logik folgend sollte verwendet werden, während über Spalten Ableitung

  1. Configuration Tabelle Reihenfolge der Präferenz hat, welcher Benutzer dynamisch (dh ändern können, wenn Land ist Austria dann sollte ID Präferenz LEI dann TIN sein (im Falle LEI ist Leerzeichen), dann CONCAT (wenn beide leer sind, dann irgendeine andere Logik)

  2. Bei Vertrags-ID = 3 ist Land BG, daher sollte LEI zuerst überprüft werden, da NULL, CCPT = 456 ausgewählt wird.

Ich könnte COALESCE und CASE Anweisung verwendet haben, falls hardcoding erlaubt ist.

Können Sie bitte bitte einen alternativen Ansatz vorschlagen?

Grüße

Digant

+1

Was ist Ihr Versuch? – Sunil

+0

Ich bin immer noch unsicher über Ansatz (dynamische Sql oder etwas anderes) anstatt Lösung. – Digant

Antwort

0

Für eine gute Zeit Angenommen Wahl 411., dass dies einige horrenden Daten-Dump ist und Sie versuchen, es hier zu bereinigen, ist einige SQL um sich zu werfen. :) Zunächst konnte ich Ihren Bildtext über Adobe Acrobat> Excel erfassen.

(I baute auch das Schema für Sie unter: http://sqlfiddle.com/#!6/8f404/12)

Erstens ist die richtige Sache ist das eklatante Problem zu tun beheben und das ist die Tabellenstruktur. Angenommen, Sie können hier keine Lösung finden.

Also, hier ist es und was es tut ist die Spalten LEI, NIND, CCPT und TIN aus der Detail-Tabelle und auch FirstPref, SecondPref, ThirdPref aus der Konfigurationstabelle. Grundsätzlich hilft dies dabei, die Daten zu normalisieren, obwohl es Ihnen große Leistung kostet, wenn es keine Pläne gibt, die Datenstruktur zu reparieren, oder Sie nicht können. Danach fügen Sie einfach die Tabellen Detail.ContactId bis DerivedPrefs.ISOCountryCode bis DerivedPrefs.ISOCountryCode zu Detail.CountrylSOCountryCode und DerivedTypes.ldentificationType = DerivedPrefs.ldentificationType Wenn Sie einen inneren Join statt der linken Join verwenden, können Sie die RANK() Funktion entfernen, aber es werden nicht alle ContactIds angezeigt, nur diejenigen, die einen Wert in ihrer haben LEI-, NIND-, CCPT- oder TIN-Spalten. Ich denke, das ist sowieso eine bessere Lösung, denn warum sollten Sie einen Fehler in einem Bericht sehen? Schreiben Sie einen separaten Bericht für diejenigen ohne Werte in diese Spalten. Schließlich können Sie mit der TOP (1) with ties einen Datensatz pro ContactId anzeigen und die Aufzeichnung mit dem Fehler weiterhin anzeigen. Hoffe das hilft.

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)