使用SELECT CASE或类似

时间:2016-02-08 15:43:45

标签: sql-server tsql join case

我想使用SELECT CASE将查询包含在单独的行中。而不是在同一行上重复Field,Tape Capture Value和Tape Value,将它放在一个单独的行上会很棒。有人可以帮忙吗?谢谢,如果可以的话!

这是我当前的查询:

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

2 个答案:

答案 0 :(得分: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中得到了证明,但它并不是你所希望的那样。

答案 1 :(得分:0)

您可以使用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

**