我有一个包含ID的表,并带有备用标识符。
ID| Alternate
1 | 100000000
1 | 8471
1 | 1248
2 | 578887518
2 | 8415
2 | 3574
3 | 100000000
3 | 1248
有两种类型的备用标识符.9位数和4位数。每个ID,有一个9位数的替代,然后最多四个不同的4位数。
我的问题是该表不是唯一的。存在类似于上述示例ID 1和3的情况。可能存在情况,虽然我还没有找到一个,其中9位数字标识符匹配,但是存在不同的4位数标识符。
ID | Alternate
5 | 200000000
5 | 1234
6 | 200000000
6 | 4567
我的目标是创建一个表,并在备用标识符值上进行透视,但是我目前为同一个用户获取两行。
有人知道如何解决这个问题吗? 当前代码
SELECT ID, [THCI], [2101] , [2202], [2245]
FROM
(SELECT
T1.[ID],
T1.[IDENTIFIER],
CASE WHEN T2.[MAIN_IDENT] IS NULL THEN 'THCI' ELSE T2.[MAIN_IDENT] END AS PIV
FROM MYTABLE T1
LEFT OUTER JOIN TABLE2 AS T2 ON T2.[REFNO] = T1.[REFNO]
WHERE
(LEN(T2.[MAIN_IDENT]) = 4 OR T2.[MAIN_IDENT] IS NULL)
AND (LEN(T1.[IDENTIFIER]) = 4 OR LEN(T1.[IDENTIFIER]) = 9)
) AS SourceTable
PIVOT (MAX([IDENTIFIER]) FOR PIV IN ([THCI], [2245], [2202], [2101],[2345],[2303])) AS MYPIV
编辑: 预期的产出将是。另请注意,它是四个备用标识符,而不是三个。虽然不会改变很多
[ID] | [THCI] | [2245] | [2202] | [2101] | [2345]
1 | 100000000 | 4817 | 6824 | NULL | 1587
2 | 845279514 | 2359 | 7847 | 1234 | NULL
3 | 415784521 | 2415 | NULL | NULL | 8747
答案 0 :(得分:0)
如果您的目标只是检索省略重复值的数据,可以先检索9个字符IDENTIFIER
的数据(按MAX(ID)分组),然后使用同一个表加入已过滤4个字符IDENTIFIER
。因此,内部SELECT语句看起来与此类似(在其上应用PIVOT):
SELECT
IDENT9.ID,
IDENT9.IDENTIFIER,
IDENT4.IDENTIFIER
FROM
(SELECT
MAX([ID]) ID,
[IDENTIFIER],
FROM MYTABLE
WHERE LEN([IDENTIFIER]) = 9
GROUP BY [IDENTIFIER]) AS IDENT9
LEFT OUTER JOIN
(SELECT
MAX([ID]) ID,
[IDENTIFIER],
FROM MYTABLE
WHERE LEN([IDENTIFIER]) = 4
GROUP BY [IDENTIFIER]) AS IDENT4
ON IDENT4.ID = IDENT9.ID
这里的想法是在单独的列中包含9个字符的标识符和4个字符的标识符。 IDENT4和IDENT9视图的目的是删除重复项。
但是,如果您的目标是修复数据库完整性,那么您需要考虑在两个单独的表中分隔9个字符和4个字符的标识符。根据您的说法,我可以假设每个ID都有一个9个字符的标识符和至少一个(或多个)4个字符的标识符。因此,您将使用IDENT9查询作为基础创建一个包含9个字符ID的主表,以及一个“从属”4个字符的ID表。使用这些表,您可以在数据库级别创建约束,强制执行重复检查