2017-07-13 61 views
0

我一直在编写一个SQL查询以基于类似的ID组卷起多个余额,并针对标记为N的产品显示余额。我想我需要使用分区函数或最大功能来做到这一点。使用分区的SQL Server聚合

所需结果位于示例数据集下面的表格中。任何人都可以解决这个问题吗?

有人会知道逻辑来帮助吗?基本上我需要用ID将所有东西都分组,并且有N个标志的地方滚动到该记录的平衡点,如果没有N标志的记录,我们只需通过pdct_Type_C进行聚合。

SELECT
客户端,
SUM(限制)限制,
SUM(余额)余额,
SUM(曝光)曝光,
MAX(CASE WHEN标记= 'N' THEN Pdct_type_c ELSE NULL END)Pdct_type_c,
ID
FROM
GROUP BY客户端,ID

样本数据集

 
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

记录您需要告诉我们你已经尝试了什么。最基本的(假设你的样本代表了所有的数据),你需要使用GROUP BY,这是一个相当简单的查询。你也不应该将数据发布为图片。将它作为文本包含在实际问题中。请参阅:https://stackoverflow.com/help/how-to-ask – Alex

+1

Thankyou,我发布了一个基本数据集,其中包含我正在寻找的结果。基本上我希望根据相同的ID汇总组,并将余额滚动到该组中的客户端,并将其标记为'N'。 – Patty

回答

0

这是完全p这可以通过窗口函数来实现。不过这里是做

的老式方法这说明我们只是有一个N项

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

这外连接到它决定如何组

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,然后将其聚合为一条记录。 客户端只是一个正常的varchar类型名称,所以可以是'Ron'或'Greg',ID字段显示记录都是同一个事务的一部分,所以如果上面的客户端的信用额度为6000万美元,通过使用单独的产品(外汇和外汇)降低了该限额的3,000,000美元。我的目标是对DERIV产品获得3,000,000美元的总额。 – Patty

+0

要做的最好的事情就是编辑你的问题并扩展你的数据例子。从我的理解你的评论,其主要是关于让案件陈述正确,以挑选出正确的pdct_type_c –

+0

谢谢,我会这样做前进 – Patty