0

この要件をどのように解決できますか。助けてください。

クライアントテーブル -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  

私に知らせてください、他に何かありますか?

4

5 に答える 5

2

Try this:

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

Or, a bit more cumbsersome, but perhaps clearer:

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  
于 2012-06-21T13:42:52.973 に答える
1

どうですか:

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
于 2012-06-21T13:46:51.953 に答える
1

[Balance] のデータ型が何なのかわかりませんが、int の場合は次のようにできます。

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

[Balance] が int でない2147483647場合は、そのデータ型の最大値に置き換えてください。

もちろん、実際に残高が 2147483647 のクライアントがいる場合は危険です。そのような場合、最大残高は null として表示されます。

于 2012-06-21T14:05:28.353 に答える
0

これは 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
于 2012-06-21T13:49:30.440 に答える
0

これは機能しますが、あまりエレガントではありません。

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
于 2012-06-21T13:57:19.057 に答える