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)
Was ist Ihr Versuch? – Sunil
Ich bin immer noch unsicher über Ansatz (dynamische Sql oder etwas anderes) anstatt Lösung. – Digant