为所有具有相同 ID 的记录分配 SQL 服务器中结果集中列中的现有值

Assign all records which have the same ID, an existing value in a column from the result set in SQL Server

我有一个查询结果集,看起来像这样:

CASEID AssessmentID QUESTION QUARTER ANSWER
1 1 WhatQuarter Q1 Q1
1 1 QuestionB NULL Y
1 1 QuestionC NULL Z
1 19 WhatQuarter Q2 Q2
1 19 QuestionB NULL Y
1 19 QuestionC NULL Z
2 3 WhatQuarter Q1 Q1
2 3 QuestionB NULL Y
2 3 QuestionC NULL Z
3 7 WhatQuarter Q3 Q3
3 7 QuestionB NULL Y
3 7 QuestionC NULL Z

我想做的是将季度列中的值分配给这些结果中具有相同 ID 的所有记录。我希望我的结果看起来像这样:

CASEID AssessmentID QUESTION QUARTER ANSWER
1 1 WhatQuarter Q1 Q1
1 1 QuestionB Q1 Y
1 1 QuestionC Q1 Z
1 19 WhatQuarter Q2 Q2
1 19 QuestionB Q2 Y
1 19 QuestionC Q2 Z
2 3 WhatQuarter Q1 Q1
2 3 QuestionB Q1 Y
2 3 QuestionC Q1 Z
3 7 WhatQuarter Q3 Q3
3 7 QuestionB Q3 Y
3 7 QuestionC Q3 Z

我知道有一些聪明的方法可以使用 CASE WHEN 来实现这一点,但我似乎无法理解它。理想情况下,这不会涉及任何临时表。数据库在这方面的设计很差,因为它没有记录评估开始的日期,所以这意味着我必须使用 CASE WHEN 来生成季度列。任何帮助将不胜感激,谢谢:)

编辑:

查询如下,有 CaseReference = 示例中的 CaseID ASVFieldName = 问题

其他列匹配名称。

USE MyPersonalSupport_reporting

DECLARE @StartDate AS DATE 
SET @StartDate = '2021-10-01' 

DECLARE @EndDate AS DATE 
SET @EndDate = '2021-12-31'  

SELECT

*

FROM 


(SELECT 

SubContractName,
CCC.CaseReference,
AssessmentTemplate,
CCC.Keyworker,
ASVFieldName,
CASE WHEN ASVFieldName = 'Level_of_support' THEN LookupAnswer ELSE NULL END AS LevelOfSupport,
CASE WHEN (ASVFieldName = 'Quarter') OR (ASVFieldName LIKE '%What_quarter%') THEN LookupAnswer ELSE NULL END AS [Quarter],
ASVType,
ASVValue,
CASE WHEN Answer IS NULL THEN AAA.LookupAnswer ELSE Answer END AS Answer,
CCC.CurrentCaseStatus,
FullName AS CustomerFullName,
DateReceived,
LIVE,
ServiceEndDate,
ASSApprovalStatus,
ASTPublishLevel,
AAA.ClientModified,
AAA.ClientCreated,
AAA.AssessmentId


FROM mps.CaseContractCustomer as CCC 

LEFT JOIN mps.CrossTabCaseStatusChangeDates as CSCDV ON CCC.CaseID = CSCDV.CaseID
LEFT JOIN mps.AssessmentsQuarterEndAnswers AS AAA ON CCC.CaseID = AAA.CaseId


WHERE 

CSCDV.Live < @EndDate

AND (CCC.ServiceEndDate > @StartDate OR CCC.ServiceEndDate IS NULL)

AND AssessmentTemplate LIKE 'Quarter%'


) AS X

WHERE ClientCreated > DATEADD(week,-3,@StartDate)

ORDER BY X.SubContractName, X.CaseReference, X.AssessmentId, X.Quarter DESC, X.KeyWorker, X.ClientModified OFFSET 0 ROWS

然后您必须提供您的查询,但这是一种方式:

select * , max(QUARTER) over (partition by CASEID, AssessmentID) as new_quarter
from yourtable 

所以将其合并到您的查询中:

select ... , 
max(CASE WHEN (ASVFieldName = 'Quarter') OR (ASVFieldName LIKE '%What_quarter%') THEN LookupAnswer
                  ELSE NULL
              END) over (partition by CASEID, AssessmentID) as [Quarter] 
,...