SQL Vlookup 同一张表中的值以从另一个表中获取值

问题描述 投票:0回答:2

我有一个包含三列的表(

gbfol_det
)和一个包含一列的第二个表(
argcloy_h
)。

我需要做类似于 Excel VLOOKUP 的事情。我想检查

posting_code = 'gcs'
,然后使用
gsp
找到相关的
breakdown_link
发布。从那里它应该从那个
card_number
行中获取相关的
gsp

这是我当前的查询:

SELECT '[dbo].[gbfol_det]' AS 'TABLE_NAME', det.folio_number, det.breakdown_link, det.posting_code, '[dbo].[argcloy_h]' AS 'TABLE_NAME', gc.card_number
FROM gbfol_det det
LEFT JOIN argcloy_h gc ON det.folio_number = gc.folio_number

返回以下数据:

TABLE_NAME folio_number 故障链接 posting_code TABLE_NAME 卡号
[dbo].[gbfol_det] 501990 734210 gsp [dbo].[argcloy_h] 12062000020615
[dbo].[gbfol_det] 501993 734210 pmc [dbo].[argcloy_h]
[dbo].[gbfol_det] 501993 734210 gcs [dbo].[argcloy_h]

我想要的结果如下:

TABLE_NAME folio_number 故障链接 posting_code TABLE_NAME 卡号
[dbo].[gbfol_det] 501990 734210 gsp [dbo].[argcloy_h] 12062000020615
[dbo].[gbfol_det] 501993 734210 pmc [dbo].[argcloy_h]
[dbo].[gbfol_det] 501993 734210 gcs [dbo].[argcloy_h] 12062000020615

我试过做一个子查询(SELECT 语句中的第二个 SELECT),也尝试做一些 CASE WHEN SELECT 但都无法工作。

sql sql-server-2012 left-join ssms window-functions
2个回答
0
投票

据我了解您的问题,您希望通过从具有相同

'gcs'
'gsp'
行中获取相应的值来计算每个
breakdown_link
行的卡号。

如果是这样,我会推荐窗口功能和

case

SELECT '[dbo].[gbfol_det]' AS 'TABLE_NAME', 
    det.folio_number, 
    det.breakdown_link, 
    det.posting_code, 
    '[dbo].[argcloy_h]' AS 'TABLE_NAME', 
    CASE det.posting_code
        WHEN 'gcs' THEN MAX(CASE WHEN det.posting_code = 'gsp' THEN gc.card_number END) OVER(PARTITION BY det.breakdown_link)
        ELSE gc.card_number
    END as card_number
FROM gbfol_det det
LEFT JOIN argcloy_h gc ON det.folio_number = gc.folio_number

0
投票

如果没有样本数据,很难准确理解你在做什么。您的描述也没有什么意义,因为您声称 argcloy_h 只有一列,而您加入 folio_number 并将 card_number 放入选择列表。所以这至少是 2.

我假设您想执行以下操作:

  1. 对于 gbfol_det 中 posting_code = gsp 的行,在 argcloy_h 中有相应的 folio_number,从那里找到 card_number
  2. 对于gbfol_det中posting_code = gcs的行,找到同表中posting_code = gsp和相同breakdown_link的对应行

有几种方法可以实现这一点,要么加入 argclov_h 两次,一次直接加入,一次通过 gsp 行加入,或者使用 CTE,然后自加入该 CTE 以找到 gcs 行的匹配 gsp 行。这是第二种情况,因为我喜欢 CTE:

with gsp_resolved as (
   select det.folio_number, det.breakdown_link, det.posting_type, gc.card_number
     from gbfol_det det
     left outer
     join argcloy_h gc 
      on det.folio_number = gc.folio_number -- match by folio number
     and det.posting_type = 'gsp' -- for gsp rows
)
select gsp_resolved.folio_number, gsp_resolved.breakdown_link, gsp_resolved.posting_type
     , coalesce(gsp_resolved.card_number, gsp_for_gcs.card_number) as card_number -- either use own resolved card number, or take from the corresponding gsp row
  from gsp_resolved 
  left outer 
  join gsp_resolved gsp_for_gcs
    on gsp_resolved.posting_type = 'gcs' -- for my gcs rows
   and gsp_for_gcs.posting_type = 'gsp' -- get me a gsp row
   and gsp_for_gcs.breakdown_link = gsp_resolved.breakdown_link -- with a matching breakdown_link

现场演示

© www.soinside.com 2019 - 2024. All rights reserved.