SQL根据其他两人的ID从两列获取MAX和MIN值

时间:2019-06-06 21:08:21

标签: sql sql-server database tsql

我在查找查询时遇到困难,有人可以帮助我吗? 问题: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 

1 个答案:

答案 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_ScoreTest_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