我需要在Key上加入以下2个表。在决赛桌中,我需要 contact1 中的 Rank1 数据,如果 Rank1 不存在,我需要检查下一个 Rank。如果 Rank1 数据到达 contact1,那么我不应该考虑 contact2 和 contact3 的 Rank1。有没有办法用sql来做?
表A:
钥匙1 |
---|
1234 |
3456 |
表B
钥匙2 | 排名 | 联系方式 |
---|---|---|
1234 | 1 | 楼主 |
1234 | 2 | 共同拥有者 |
1234 | 3 | 首席执行官 |
3456 | 2 | 共同拥有者 |
3456 | 3 | 首席执行官 |
决赛桌:
键 | 联系方式1 | 联系方式2 | 联系3 |
---|---|---|---|
1234 | 楼主 | 共同拥有者 | 首席执行官 |
3456 | 共同拥有者 | 首席执行官 |
您可以结合使用 ROW_NUMBER() 函数和条件聚合来实现所需的结果。这是一个可以实现您目标的 SQL 查询:
WITH RankedContacts AS (
SELECT
Key2 AS [Key],
Contact,
ROW_NUMBER() OVER (PARTITION BY Key2 ORDER BY Rank) AS RowNum
FROM
TableB
)
SELECT
[Key],
MAX(CASE WHEN RowNum = 1 THEN Contact END) AS contact1,
MAX(CASE WHEN RowNum = 2 THEN Contact END) AS contact2,
MAX(CASE WHEN RowNum = 3 THEN Contact END) AS contact3
FROM
RankedContacts
GROUP BY
[Key];
此查询首先根据每个键的排名对联系人进行排名。然后,它使用条件聚合将适当的联系人分配给 contact1、contact2 和 contact3。
可以在这里找到有关此问题的更广泛的讨论:sql server 中的行号