首页 > 解决方案 > SQL CASE 表达式没有在 3 列中选择最大值,MAX 也不是

问题描述

我试图找到跨 3 列的行的最大值。我尝试了几种方法,但都失败了。

原始数据:

| max_adsl_predicted_down | max_sfbb_predicted_down | max_ufbb_predicted_down

| 10 | 60 | -1
| 10 | 80 | 350
| 10 | 1 | -1

期望的输出:

| 最大下载 |

| 60 |

| 350 |

| 10 |

数据样本和用于生成它的 SQL


Select TOP(379)
    max_adsl_predicted_down,
    max_sfbb_predicted_down,
    max_ufbb_predicted_down
FROM table

15 80 -1

15 80 -1

15 80 -1

15 80 -1

15 80 -1

15 80 -1

10 80 350

10 80 350

使用 CASE 表达式:


SELECT TOP(379) 
    CASE WHEN max_ufbb_predicted_down > max_adsl_predicted_down AND max_ufbb_predicted_down > max_sfbb_predicted_down THEN max_ufbb_predicted_down
         WHEN max_sfbb_predicted_down > max_adsl_predicted_down AND max_sfbb_predicted_down > max_ufbb_predicted_down THEN max_sfbb_predicted_down
         WHEN max_adsl_predicted_down > max_sfbb_predicted_down AND max_adsl_predicted_down > max_ufbb_predicted_down THEN max_adsl_predicted_down
    END AS max_download
FROM table

80

80

80

80

80

80

80

80

使用 MAX 表达式:

SELECT TOP(379)
      (SELECT MAX(speeds)
       FROM (VALUES (max_ufbb_predicted_down), (max_adsl_predicted_down), (max_sfbb_predicted_down)) as speeds(speeds) )AS max_download
FROM table

80

80

80

80

80

80

80

80

我不明白为什么这些方法没有连续返回最高值。您能否提出解决方案或这些方法不起作用的原因?

谢谢,

标签: sql-servermaxcasemultiple-columns

解决方案


SQL Server 不支持标量GREATEST函数,与许多其他数据库一样。取而代之的是,我们可以使用一个CASE表达式:

SELECT
    CASE WHEN max_adsl_predicted_down > max_sfbb_predicted_down AND
              max_adsl_predicted_down > max_ufbb_predicted_down
         THEN max_adsl_predicted_down
         WHEN max_sfbb_predicted_down > max_ufbb_predicted_down
         THEN max_sfbb_predicted_down
         ELSE max_ufbb_predicted_down END AS max_download
FROM yourTable;

col1三列,col2和,的一般形式更易于阅读col3

SELECT
    CASE WHEN col1 > col2 AND col1 > col3 THEN col1
         WHEN col2 > col3 THEN col2
         ELSE col3 END AS greatest_col
FROM yourTable;

推荐阅读