如果 ID 在任何行中具有特定值,则更改值
Posted
技术标签:
【中文标题】如果 ID 在任何行中具有特定值,则更改值【英文标题】:Changing Values if ID Has a Certain Value in Any Row 【发布时间】:2020-07-22 23:33:15 【问题描述】:我的表中有两列。一列是 ID,另一列是 TestResult。此表中有具有相同 ID 的行。假设 TestResult 可以是“Positive”、“Negative”、“Pending”或“Unknown”。因此,同一个 ID 可以显示“肯定”、“否定”、“待定”或“未知”。
这是我希望输出显示的内容。如果 ID 在任何行中都包含“正”,我希望该 ID 显示“正”。否则保持不变。
提前致谢!
【问题讨论】:
请展示一些示例数据、预期结果和您的尝试。 所以您只想显示每个 ID 一次,还是什么?这不是很清楚。我同意,样本数据和预期的查询结果会有很大帮助 如果一个 ID 有四行,您是要显示所有四行还是只显示一个“摘要”行? 【参考方案1】:如果我没看错,你可以使用窗口函数和case
表达式:
select
id,
case when max(case when test_result = 'Positive' then 1 else 0 end) over(partition by id) = 1
then 'Positive'
else testResult
end testResult
from mytable
【讨论】:
这个问题有点不清楚,但我想这就是OP想要的。 @BRuppert,请将其标记为答案。所以对以后的其他人有帮助【参考方案2】:CASE & Window Functions 的答案效果很好......但是这里有一个使用子查询的选项。
IF OBJECT_ID('tempdb..#TestData') IS NOT NULL DROP TABLE #TestData
SELECT * INTO #TestData FROM (VALUES
(1, 'Positive'),
(2, 'Positive'),
(2, 'Negative'),
(3, 'Unknown'),
(3, 'Negative'),
(3, 'Positive'),
(4, 'Pending'),
(4, 'Positive'),
(5, 'Unknown'),
(6, 'Negative'),
(7, 'Unknown'),
(7, 'Positive'),
(8, 'Positive')
) S(ID, TestResult)
-- Display Test Result Data
SELECT ID, TestResult FROM #TestData
-- Display Query Proposal
SELECT
ID,
CASE WHEN EXISTS(SELECT * FROM #TestData T2 WHERE T2.ID = T1.ID AND T2.TestResult = 'Positive') THEN 'Positive' ELSE T1.TestResult END
FROM
#TestData T1
【讨论】:
以上是关于如果 ID 在任何行中具有特定值,则更改值的主要内容,如果未能解决你的问题,请参考以下文章
数据库:如果任何行中的字段 X 具有值 Y,则排除“分组依据”组
如果这些行中至少有一个具有给定值,则选择具有给定 ID 的所有行