我想使用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
而不是以当前形式获得我的结果:
我希望以下面的形式:
答案 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
糟糕。而不是表值构造函数,请将select
与union 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
**