2017-07-13 4 views
0

類似のIDグループに基づいて複数の残高をロールアップし、フラグがNの商品との残高を表示するSQLクエリの作成は難しかったです。パーティション関数またはこれを行う最大限の機能。パーティショニングを使用したSQL Serverの集計

希望する結果は、サンプルデータセットの下の下の表にあります。誰にもこれを利用できるように修正されていますか?

誰でもこれを助けるロジックを知っていますか?基本的に私はIDですべてをグループ化する必要があります.Nのフラグがある場合は、そのレコードまで残高を転記します.Nのフラグを持つレコードがない場合は、pdct_Type_Cで集計します。


クライアント、
SUM(リミット)リミット、
SUM(バランス)バランス、
SUM(露光)露光、
MAX(CASEフラグ= 'N' THEN Pdct_type_c ELSE NULLを選択END)Pdct_type_c、
ID

群からクライアント、ID BY

SAMPLEデータセット

 
Client | Limit  | Balance  | Exposure | Pdct_type_c | Flag | ID 
-------------------------------------------------------------------------------- 
John | 60,000,000.00| -    | 5,000,000| DERIV  | N | 2 
John | -   | 1,000,000.00 | -  | FX   | y | 2 
John | -   | 2,000,000.00 | -  | IC   | y | 2 
John | 1,000,000.00 | 3,000,000.00 | -  | DCO   | y | 3 
John | 1,000,000.00 | 3,000,000.00 | -  | DCO   | y | 3 

現在の結果

 
Client | Limit  | Balance  | Exposure | Pdct_type_c | Flag | ID 
-------------------------------------------------------------------------------- 
John | 60,000,000.00| 3,000,000.00 | 5,000,000| DERIV  | N | 2 
John | 2,000,000.00 | 6,000,000.00 | -  | NULL  | Y | 3 


所望の結果

 
Client | Limit  | Balance  | Exposure | Pdct_type_c | Flag | ID 
-------------------------------------------------------------------------------- 
John | 60,000,000.00| 3,000,000.00 | 5,000,000| DERIV  | N | 2 
John | 2,000,000.00 | 6,000,000.00 | -  | DCO   | Y | 3 


+0

上のグループに何を決定する

SELECT ID, MIN(Pdct_type_c) Pdct_type_c FROM Table WHERE Flag = 'N' GROUP BY ID 

この外側がそれに参加するN個のエントリを持っている私たちだけのレコードを示して

を行うための昔ながらの方法がありますあなたが試したことを私たちに示す必要があります。最も基本的な(あなたのサンプルがすべてのデータの代表であると仮定して)あなたは 'GROUP BY'を使う必要があり、これはかなり簡単なクエリです。また、画像として画像を投稿しないでください。それをテキストとして実際の質問に含めます。参照してください:https://stackoverflow.com/help/how-to-ask – Alex

+1

ありがとう、私は私が求めている結果を持つ基本的なデータセットを投稿しました。基本的に私は同じIDに基づいてグループを集計し、フラグ= 'N'でそのグループのクライアントに残高を振り向かせることを検討しています。 – Patty

答えて

0

それは完全にPでありますossibleこれはウィンドウ関数で実行可能です。しかし、ここでこれは

SELECT 
T.Client, 
SUM(T.Limit) Limit, 
SUM(T.Balance) Balance, 
SUM(T.Exposure) Exposure, 
ISNULL(N.Pdct_type_c, T.Pdct_type_c) Pdct_type_c 
CASE WHEN N.Pdct_type_c IS NULL THEN T.Flag ELSE 'N' END Flag, 
T.ID 
FROM Table T 
LEFT OUTER JOIN 
(
SELECT 
ID, 
MIN(Pdct_type_c) Pdct_type_c 
FROM Table 
WHERE Flag = 'N' 
GROUP BY ID 
) N 
ON T.ID = N.ID 
GROUP BY T.Client, T.ID, 
ISNULL(N.Pdct_type_c, T.Pdct_type_c), 
CASE WHEN N.Pdct_type_c IS NULL THEN T.Flag ELSE 'N' END 
+0

それは私が持っている別の問題です。上記のように 'N'のフラグがない場合、他の製品をそのまま、あるいは同じpdct_type_cを持って1つのレコードに集約したいと思います。 クライアントは通常のvarcharタイプの名前なので、 'Ron'または 'Greg'の場合があります。IDフィールドはレコードがすべて同じトランザクションの一部であることを示します。したがって、上記のクライアントのクレジット限度額は$ 60,000,000で、別個の製品(FXとIC)を使用して、その限度額の300万ドルを引き下げた。私の目的は、DERIV製品に対して3,000,000ドルの集計をすることです。 – Patty

+0

あなたの質問を編集してデータの例を拡張するのが最善の方法です。あなたのコメントから私が理解しているところから、大文字小文字のステートメントが正しいpdct_type_cを選ぶ正しいことを得ることについて主に –

+0

ありがとう、私はこれを進める – Patty

関連する問題