【问题标题】:SQL Server Query similar to VLOOKUP logic in excelSQL Server Query 类似于 Excel 中的 VLOOKUP 逻辑
【发布时间】:2015-11-11 04:28:29
【问题描述】:

表 A:

  • AccountID(PK,int,非空)
  • 代理 (varchar(50), null)
  • AccountType (varchar(50), null)

样本表:

╔═══════════╦════════════════╦═══════╗
║ AccountID ║  AccountType   ║ Agent ║
╠═══════════╬════════════════╬═══════╣
║  413393   ║  Invoice       ║  A    ║
║  417811   ║  Credit        ║  NULL ║
╚═══════════╩════════════════╩═══════╝

表 B:

  • AccountID(int, not null) - 这是外键,我根据匹配的 AccountID 记录从两个表中提取数据。
  • Ref_AccountID (int, null)

样本表:

╔═══════════╦════════════════╦
║ AccountID ║  Ref_AccountID ║ 
╠═══════════╬════════════════╬
║  413393   ║  NULL          ║  
║  417811   ║  413393        ║  
╚═══════════╩════════════════╩

说明: 如果 AccountType 是 invoice,那么会有一个 Agent 与之关联。从表 A 可以看出,它与代理 A 相关联。

电流输出:

╔═══════════╦═════════════╦═══════════════╦═══════╗
║ AccountID ║ AccountType ║ Ref_AccountID ║ Agent ║
╠═══════════╬═════════════╬═══════════════╬═══════╣
║  413393   ║ Invoice     ║    NULL       ║ A     ║
║  417811   ║ Credit      ║    413393     ║ NULL  ║
╚═══════════╩═════════════╩═══════════════╩═══════╝

预期输出:

╔═══════════╦═════════════╦═══════════════╦═══════╗
║ AccountID ║ AccountType ║ Ref_AccountID ║ Agent ║
╠═══════════╬═════════════╬═══════════════╬═══════╣
║  413393   ║ Invoice     ║    NULL       ║ A     ║
║  417811   ║ Credit      ║    413393     ║ A     ║
╚═══════════╩═════════════╩═══════════════╩═══════╝

应根据 Ref_AccountID 显示代理。在本例中,Ref_AccountID 为 413393,对于表 A 中的此 AccountID,Agent 为“A”。

谢谢

【问题讨论】:

标签: sql sql-server


【解决方案1】:

这可能是您正在寻找的答案。我已经包含了一个完整的查询。它首先将表 A 和 B 连接在一起,然后自连接回表 A。从您更新的信息来看,当一条记录的 Agent 列的值为空时,您希望改用 @987654323 AccountID与前一条记录的Ref_AccountID匹配的记录对应的@值与空Agent。自联接在查询中是必需的,因为它使 Agent 的这个替代值可能在每条记录中可用,并且可能具有空的 Agent 列。这是查询:

SELECT t1.AccountID, t1.AccountType, t2.Ref_AccountID,
    CASE WHEN t1.Agent IS NOT NULL THEN t1.Agent ELSE t3.Agent END AS Agent
FROM TableA t1 INNER JOIN TableB t2 ON t1.AccountID = t2.AccountID
LEFT JOIN TableA t3 ON t2.Ref_AcccountID = t3.AccountID

这是一个有效的SQL Fiddle,您可以在其中使用您在原始问题中提供的测试数据测试此查询。

【讨论】:

  • 非常感谢蒂姆。但是,当我运行查询时出现以下错误:“将 varchar 值 'A' 转换为数据类型 int 时转换失败。”
  • 我认为Ref_AccountID 是整数类型。您需要将Ref_AccountID 转换为varcharCOALESCE(Agent, cast(Ref_AccountID as varchar(20))
  • @Tim:是的,它是整数类型。
  • 嗨,蒂姆,查询运行良好,但代理字段看起来仍为空白。
  • @Pavan - Agent 列中是否有空字符串
【解决方案2】:

你正在寻找

SELECT * FROM yourTable
WHERE
AccountID = 466361  

查看更多示例:

https://msdn.microsoft.com/en-us/library/ms187731.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-21
    • 2015-06-23
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    相关资源
    最近更新 更多