我有一个包含三列的表(
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 但都无法工作。
据我了解您的问题,您希望通过从具有相同
'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
如果没有样本数据,很难准确理解你在做什么。您的描述也没有什么意义,因为您声称 argcloy_h 只有一列,而您加入 folio_number 并将 card_number 放入选择列表。所以这至少是 2.
我假设您想执行以下操作:
有几种方法可以实现这一点,要么加入 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