繁体   English   中英

SQL查询从具有Null值的表中找出最大数目

[英]SQL Query in finding out the max number from a table with Null value

我该如何解决这个要求。 请帮忙。

客户表-CT

ClientID      Balance  
123             10
123             20  
123             30
123             40  
124             50
124             60  
124             Null  

我想从CT表中找到我们的max(Balance)。
条件->如果没有null值,那么我必须找出max(Balance),否则应该为Null。 看到下面的结果,这是期望的。

ClientID     Balance  
123           40  
124           Null

正在编写查询,如下所示。 但是还有其他动态的方法吗?

Select ClientID,  
       CASE WHEN MIN(Balance) = NULL THEN  
                 NULL  
             ELSE  
                 MAX(Balance) END AS 'MaxBalance'  
From CT  
Group by clientID  

请让我知道,还有其他选择吗?

尝试这个:

Select ClientID,
       (CASE WHEN count(balance) < count(*)
             THEN NULL 
             ELSE MAX(Balance)
        END) AS MaxBalance
From CT
Group by clientID  

或者,更麻烦一些,但也许更清楚:

Select ClientID,
       (CASE WHEN sum(case when balance is null then 1 else 0 end) > 0
             THEN NULL 
             ELSE MAX(Balance)
        END) AS MaxBalance
From CT
Group by clientID  

怎么样:

SELECT clientid
    , balance
FROM 
    ( 

        SELECT clientid
            , balance
            , row_number()
                over(   partition by clientid
                    order by CASE WHEN balance IS NULL THEN 0 ELSE 1 END
                        , balance DESC
                ) r
        FROM ct
    ) n 
WHERE r = 1

我不确定[Balance]是什么数据类型,但是如果它是整数,则可以执行以下操作:

Select ClientID, NULLIF(MAX(ISNULL(Balance,2147483647)),2147483647)
From CT 
GROUP BY ClientID

如果[Balance]不是int,只需将2147483647替换为该数据类型的最大值。

危险当然是如果您确实有一个余额为2147483647的客户。在这种情况下,他们的最大余额将显示为空。

这将适用于SQL 2005+

; WITH a AS (       
SELECT DISTINCT ClientID
FROM CT 
WHERE Balance IS NULL   )     

SELECT t.ClientID, MAX(t.Balance) "MaxBalance"
FROM CT t
    LEFT JOIN a ON t.CLientID = a.ClientID
WHERE a.ClientID IS NULL
GROUP BY t.CLientID
UNION ALL
SELECT a.ClientID, NULL
FROM a

这可行,但不是很优雅:

SELECT SUB.ClientID, CASE (SELECT COUNT(ClientID) 
                           FROM MyTable MT 
                           WHERE Balance IS NULL 
                           AND MT.ClientID = SUB.ClientID)
                    WHEN 0 THEN (SELECT MAX(Balance) 
                                 FROM MyTable MT 
                                 WHERE MT.ClientID = SUB.ClientID)
                    ELSE NULL END AS Balance
FROM (SELECT ClientID 
      FROM [MyTable] 
      GROUP BY ClientID) SUB

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM