为所有具有相同 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]
,...
我有一个查询结果集,看起来像这样:
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]
,...