当所有值均为NULL时比较最大值

时间:2018-11-29 11:38:36

标签: sql sql-server tsql

CREATE TABLE NULLTEST(TransactioNo INT, Code VARCHAR(25));

INSERT INTO NULLTEST VALUES (NULL, 'TEST1');
INSERT INTO NULLTEST VALUES (NULL, 'TEST2');
INSERT INTO NULLTEST VALUES (1,    'TEST2');

SELECT * FROM NULLTEST T
WHERE ISNULL(TransactioNo, 1) = (SELECT MAX(ISNULL(TransactioNo, 1)) FROM NULLTEST N)

我具有此表结构和示例数据以及查询。 我期望结果集中有2行。如果该特定代码没有其他事务(空值除外),则应将NULL值设为最大值。 在我的情况下,它要么仅在最大事务中就给所有3行,要么忽略了NULL值行。

预期输出:

TransactionNo  Code
NULL           TEST1
1              TEST2

6 个答案:

答案 0 :(得分:2)

您的查询就像:

SELECT * FROM NULLTEST T
WHERE 1=1

这意味着一切

ISNULL(TransactioNo, 1)始终为1,
(SELECT MAX(ISNULL(TransactioNo, 1)) FROM NULLTEST N)也总是1

在看到预期的输出后进行编辑:(仍然不需要where语句)

SELECT TransactioNo ,max(Code ) as Code  
FROM NULLTEST
group by TransactioNo 

答案 1 :(得分:1)

您可以简单地将MAX()函数与GROUP BY子句一起使用

Group byMAX()之后进行查询:

SELECT Code,MAX(TransactioNo) as TransactioNo
FROM NULLTEST
GROUP BY Code

结果:

---------------------
Code    TransactioNo
---------------------
TEST1     NULL
TEST2      1
---------------------

答案 2 :(得分:0)

尝试以下方法,使用聚合函数MAX

SELECT Code,MAX(TransactioNo) as TransactioNo 
FROM NULLTEST T 
GROUP BY Code

答案 3 :(得分:0)

只需按Code字段分组,然后通过MAX字段的TransactioNo函数获得分组列的最大值:

SELECT 
  MAX( test.TransactioNo) TransactionNo
, test.Code
FROM NULLTEST test
GROUP BY test.Code

答案 4 :(得分:0)

假设TransactioNo不能为负,只需将ISNULL(TransactioNo, 1)更改为ISNULL(TransactioNo , -1)。您需要使查询相关:

SELECT * FROM NULLTEST T
WHERE ISNULL(TransactioNo, -1) = (
    SELECT MAX(ISNULL(TransactioNo, -1))
    FROM NULLTEST N
    WHERE N.Code = T.Code
)

Demo on DB Fiddle

答案 5 :(得分:0)

如果您不满意,可以省略值为null的id,您可能会看到以下代码段:

select max(id) from nullest where id is not null;
 -- nullest is the table name..