我在查找查询时遇到困难,有人可以帮助我吗? 问题:4列代表2个单独测试的结果。其中一个摄于英国,另一个摄于美国。两者都是相同的考试,我需要找到在这两个国家进行的考试的最高和最低分数。我还需要避免使用子查询和临时表。希望能从理论上和实际上解决问题。
该表如下所示:
ResultID Test_UK Test_US Test_UK_Score Test_US_Score
1 1 2 48 11
2 4 1 21 24
3 3 1 55 71
4 5 6 18 78
5 7 4 19 49
6 1 3 23 69
7 5 2 98 35
8 6 7 41 47
我正在寻找的理想结果:
TestID HighestScore LowestScore
1 71 23
2 35 11
3 69 55
4 49 21
5 98 18
6 78 41
7 47 19
我尝试实现比较的情况,但是我仍然以子查询结束以提取最终结果。也尝试了合并,但最终再次出现在子查询中。据我认为,当进行查询时应该是一种情况,但实际上并不能提出逻辑,因为它需要匹配测试的ID。 谢谢! 我尝试过并获得最佳结果的方法(仍然是错误的)
select v.TestID,
max(case when Test_US_Score > Test_UK_Score then Test_UK_Score else null end) MaxS,
min(case when Test_UK_Score > Test_US_Score then Test_US_Score else null end) MinS
FROM ResultsDB rDB CROSS APPLY
(VALUES (Test_UK, 1), (Test_US, 0)
) V(testID, amount)
GROUP BY v.TestID
额外
M提供的答案。 Kanarkowski 是一个完美的解决方案。我不是CTE专家,而且有点困惑,如何修改此查询以返回找到min和max的行的结果ID。
类似这样:
TestID Result_ID_Max Result_ID_Min
1 3 6
2 7 1
3 6 3
额外2
查询的期望结果将是这样的。 最后两列代表原始表中找到最大值和最小值的行的ID。
TestID HighestScore LowestScore Result_ID_Of_Max Result_ID_Of_Min
1 71 23 3 6
2 35 11 7 1
3 69 55 6 3
答案 0 :(得分:1)
例如,您可以使用union
将两个国家/地区的结果汇总在一起,然后只需选择数据的最大值和最小值即可。
with cte as (
select Test_UK as TestID, Test_UK_Score as score from yourTable
union all
select Test_US as TestID, Test_US_Score as score from yourTable
)
select
TestID
,max(score) as HighestScore
,min(score) as LowestScore
from cte
group by TestID
order by TestID
额外:
我假设您想在前面的结果中添加其他列。如果不是,则只需选择以上内容,然后将Test_UK_Score
和Test_US_Score
替换为ResultID
。
with cte as (
select Test_UK as TestID, Test_UK_Score as score, ResultID from yourTable
union all
select Test_US as TestID, Test_US_Score as score, ResultID from yourTable
)
select
TestID
,max(score) as HighestScore
,min(score) as LowestScore
,max(ResultID) as Result_ID_Max
,min(ResultID) as Result_ID_Min
from cte
group by TestID
order by TestID