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(如果两者均为空白,则为其他逻辑)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或其他)而不是解决方案。