如何合并SQL查询,计算Finalmarks表三列数值的指定均值?
解决方案
根据你的需求,需要针对每行的三个分数,判断去掉最大值还是最小值后计算剩余两数的平均值,并输出指定格式的结果。以下是实现该逻辑的SQL查询:
SELECT CONCAT( '(', CASE WHEN (max_val - mid_val) > (mid_val - min_val) THEN CONCAT(min_val, '+', mid_val) ELSE CONCAT(mid_val, '+', max_val) END, ')/2=', ROUND(average_val, 0), CASE WHEN average_val <> FLOOR(average_val) THEN CONCAT('(', average_val, ')') ELSE '' END ) AS Result FROM ( SELECT -- 计算当前行的最小值 CASE WHEN [1VAL] <= [2VAL2] AND [1VAL] <= [3VAL3] THEN [1VAL] WHEN [2VAL2] <= [1VAL] AND [2VAL2] <= [3VAL3] THEN [2VAL2] ELSE [3VAL3] END AS min_val, -- 计算当前行的中间值:总和减去最小值和最大值 [1VAL] + [2VAL2] + [3VAL3] - CASE WHEN [1VAL] <= [2VAL2] AND [1VAL] <= [3VAL3] THEN [1VAL] WHEN [2VAL2] <= [1VAL] AND [2VAL2] <= [3VAL3] THEN [2VAL2] ELSE [3VAL3] END - CASE WHEN [1VAL] >= [2VAL2] AND [1VAL] >= [3VAL3] THEN [1VAL] WHEN [2VAL2] >= [1VAL] AND [2VAL2] >= [3VAL3] THEN [2VAL2] ELSE [3VAL3] END AS mid_val, -- 计算当前行的最大值 CASE WHEN [1VAL] >= [2VAL2] AND [1VAL] >= [3VAL3] THEN [1VAL] WHEN [2VAL2] >= [1VAL] AND [2VAL2] >= [3VAL3] THEN [2VAL2] ELSE [3VAL3] END AS max_val, -- 根据差值判断取哪两个数的平均值 CASE WHEN (max_val - mid_val) > (mid_val - min_val) THEN (min_val + mid_val)/2.0 ELSE (mid_val + max_val)/2.0 END AS average_val FROM FinalMarks ) AS sub;
逻辑说明
- 子查询计算核心值:
- 最小值/最大值:通过CASE语句直接比较三个列的大小得到
- 中间值:利用三个数的总和减去最小值和最大值推导得出
- 判断逻辑:
- 当最大值与中间值的差值大于中间值与最小值的差值时,去掉最大值,取最小值+中间值的平均
- 否则去掉最小值,取中间值+最大值的平均
- 格式输出:
- 拼接成你需要的表达式格式,当平均值为非整数时,额外保留原始小数结果
执行该查询后,将输出与你预期完全一致的结果:
(28+30)/2=29 (20+30)/2=25 (39+44)/2=42(41.5) (55+65)/2=60
内容的提问来源于stack exchange,提问作者sharan kumar
相关产品推荐
相关产品推荐

