SQL CASE表达式未选择3列中的最大值,也不是MAX

时间:2019-12-09 16:24:10

标签: sql-server max case multiple-columns

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

原始数据:

| max_adsl_predicted_down | max_sfbb_predicted_down | max_ufbb_predicted_down

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

所需的输出:

| max_download |

| 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

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

谢谢

2 个答案:

答案 0 :(得分:1)

与许多其他数据库一样,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;

三列col1col2col3易于理解的一般形式是:

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

答案 1 :(得分:0)

除了蒂姆的答案,您可以做的是在子查询中取消数据透视,然后使用MAX

SELECT (SELECT MAX(V.ColumnVal)
        FROM (VALUES(YT.max_adsl_predicted_down),
                    (YT.max_sfbb_predicted_down),
                    (YT.max_ufbb_predicted_down))V(ColumnVal)) AS max_download
FROM dbo.YourTable YT;