【问题标题】:Include query result on separate line using SELECT CASE or similar使用 SELECT CASE 或类似方法在单独的行上包含查询结果
【发布时间】:2016-02-08 15:43:45
【问题描述】:

我想使用 SELECT CASE 将我的查询包含在单独的行中。与其在同一行上重复字段、磁带捕获值和磁带值,不如将它放在单独的行上。有人可以帮忙吗?如果可以的话,谢谢!

这是我当前的查询:

SELECT T.[Loan Identifier], TC.Reviewer, 

    'Valuation Date' AS [Field],
    CASE 
    WHEN TC.[Valuation Date] <> T.[Valuation Date] THEN TC.[Valuation Date] END AS [Tape Capture Value], T.[Valuation Date] AS [Tape Value],

    'Underwriter name' AS [Field],
    CASE 
    WHEN TC.[Underwriter name] <> T.[Underwriter name] THEN TC.[Underwriter name] END AS [Tape Capture Value], T.[Valuation Date] AS [Tape Value]

FROM   [dbo].[Tape] AS T 
   LEFT JOIN [dbo].[Tape Capture] AS TC 
          ON T.[Loan Identifier] = TC.[Loan Identifier] 
TC.Reviewer IS NOT NULL AND TC.[Primary_review_complete?] = 1

我的结果不是当前形式:

Original

我想要下面的形式:

Required

【问题讨论】:

  • 大小写表达式在这里对您没有帮助。可能最简单的方法是将其拆分为两个查询(一个用于磁带值,一个用于磁带捕获)。然后使用 UNION ALL 将它们合并到一个结果集中。如果您可以使用一些数据创建一个 sqlfiddle,我们可以提供帮助。
  • 嗨,肖恩。我使用 Gorodon 的建议构建了一个 sqlfiddle。但是我仍然无法返回多个列。你能帮忙吗?这是小提琴:sqlfiddle.com/#!6/d94ea/1。谢谢
  • 您的小提琴中的示例数据与您发布的图像不匹配。您对 sql fiddle 的输出有何期望。顺便说一句,戈登发布的答案只是表值构造函数存在一个小语法问题。

标签: sql-server tsql join case


【解决方案1】:

最简单的方法大概是outer apply

SELECT T.[Loan Identifier], TC.Reviewer, v.*
FROM [dbo].[Tape] T LEFT JOIN
     [dbo].[Tape Capture] TC 
     ON T.[Loan Identifier] = TC.[Loan Identifier]  OUTER APPLY
     (VALUES ('Valuation Date', CASE WHEN TC.[Valuation Date] <> T.[Valuation Date] THEN TC.[Valuation Date] END, NULL)
             ('Underwriter name', NULL, CASE WHEN TC.[Underwriter name] <> T.[Underwriter name] THEN TC.[Underwriter name] END)
     ) as v(field, [Tape Capture Value], [Tape Value])
WHERE TC.Reviewer IS NOT NULL AND TC.[Primary_review_complete?] = 1

哎呀。代替表值构造函数,使用selectunion all

SELECT T.[Loan Identifier], TC.[Underwriter name], v.*
FROM [dbo].[Tape] T LEFT JOIN
     [dbo].[Tape Capture] TC 
     ON T.[Loan Identifier] = TC.[Loan Identifier]  OUTER APPLY
     (SELECT 'Valuation Date', CASE WHEN TC.[Valuation Date] <> T.[Valuation Date] THEN TC.[Valuation Date] END, NULL
      UNION ALL
      SELECT 'Underwriter name', NULL, CASE WHEN TC.[Underwriter name] <> T.[Underwriter name] THEN TC.[Underwriter name] END
     ) as v([field], [Tape Capture Value], [Tape Value])

SQL Fiddle 中演示了逻辑,但它可能不是您想要的。

【讨论】:

  • 嗨,戈登,如果我是正确的,那么 OUTER APPLY 正在尝试将两个表(磁带和磁带捕获)连接到一个表中。在两个单独的列下。对我来说,这似乎不起作用。我得到奇怪的括号错误('('附近的语法不正确,期待对话)。请你帮我理解。
  • @ConradAddo 。 . .我认为这是一个错字造成的。
  • 嗨,戈登,感谢您迄今为止的帮助。我可以使用一个列名结果([Tape Capture Value] 或 [Tape Capture])执行上述查询。但是,我遇到了“'v' 的列数少于列列表中指定的列数”的问题。
  • 嗨,戈登。我已经建立了一个 sqlfiddle。但是我仍然无法返回多个列。你能帮忙吗?这是小提琴:sqlfiddle.com/#!6/d94ea/1。谢谢
【解决方案2】:

您可以使用 UNION ALL 并执行以下操作:

**

SELECT T.[Loan Identifier], TC.Reviewer, 

    'Valuation Date' AS [Field],
    CASE 
    WHEN TC.[Valuation Date] <> T.[Valuation Date] THEN TC.[Valuation Date] END AS [Tape Capture Value], T.[Valuation Date] AS [Tape Value] 

FROM   [dbo].[Tape] AS T 
   LEFT JOIN [dbo].[Tape Capture] AS TC 
          ON T.[Loan Identifier] = TC.[Loan Identifier] 
TC.Reviewer IS NOT NULL AND TC.[Primary_review_complete?] = 1
UNION ALL
SELECT T.[Loan Identifier], TC.Reviewer, 

    'Underwriter name' AS [Field],
    CASE 
    WHEN TC.[Underwriter name] <> T.[Underwriter name] THEN TC.[Underwriter name] END AS [Tape Capture Value], T.[Valuation Date] AS [Tape Value]

FROM   [dbo].[Tape] AS T 
   LEFT JOIN [dbo].[Tape Capture] AS TC 
          ON T.[Loan Identifier] = TC.[Loan Identifier] 
TC.Reviewer IS NOT NULL AND TC.[Primary_review_complete?] = 1

**

【讨论】:

  • 嗨卡姆兰。这是否适用于超过 2 列?例如,我有 30 列。
  • 嗨@user3881822,当您说 30 列时,您的意思是 30 个不同的 [Field] 条目吗?
  • 嗨,Kamran,是的,有 30 个 [Field] 条目(列)和约 700 行。
  • 所以如果我理解正确,那么您将需要 30 个 UNION 所有语句,这会变得有点难看。我会研究 Gordon Linoff 的解决方案,因为您只需要更新 OUTER APPLY 中的 CASE 语句。您仍然需要 30 个 CASE 陈述。但是,如果我有您提供的一些示例数据,我将能够给您一个更好的答案。希望这会有所帮助。
  • 嗨卡姆兰。我使用示例数据制作了一个 sqlfiddle。你能帮忙吗? sqlfiddle.com/#!6/d94ea/1。我收到一条错误消息,提示“v”的列数少于列列表中指定的列数。
猜你喜欢
  • 2022-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多