Sql server 使用分区的SQL Server聚合

Sql server 使用分区的SQL Server聚合,sql-server,Sql Server,我一直很难编写一个SQL查询来根据一个相似的ID组汇总多个余额,并根据带有N标志的产品显示余额。我想我需要使用分区函数或max函数来完成这项工作 所需结果在示例数据集下的下表中。是否有人可以对此进行修复 有谁知道这方面的逻辑吗?基本上,我需要根据ID对所有内容进行分组,如果有标志N,则将余额汇总到该记录,如果没有标志为N的记录,则我们只需按pdct_Type_C进行汇总 挑选 客户 SUMLimit限制, SUMBalance余额, 在接触方面, MAXCASE WHEN Flag='N'然后是

我一直很难编写一个SQL查询来根据一个相似的ID组汇总多个余额,并根据带有N标志的产品显示余额。我想我需要使用分区函数或max函数来完成这项工作

所需结果在示例数据集下的下表中。是否有人可以对此进行修复

有谁知道这方面的逻辑吗?基本上,我需要根据ID对所有内容进行分组,如果有标志N,则将余额汇总到该记录,如果没有标志为N的记录,则我们只需按pdct_Type_C进行汇总

挑选 客户 SUMLimit限制, SUMBalance余额, 在接触方面, MAXCASE WHEN Flag='N'然后是Pdct_type_c,否则为NULL结束Pdct_type_c, 身份证件 从桌子上 按客户端分组,ID

样本数据集

当前结果

预期结果


这是完全可能的,这是可行的窗口功能。然而,这是一种老式的方法

这只显示了具有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 

你需要向我们展示你的尝试。最基本的假设是,假设您的示例代表了需要使用GROUPBY的所有数据,并且这是一个相当简单的查询。此外,您不应将数据发布为图片。将其作为文本包含在实际问题中。请看:谢谢,我已经发布了一个基本的数据集,其中包含我正在寻找的结果。基本上,我希望基于相同的ID聚合组,并使用标志='N'将余额汇总到该组中的客户机中。这是我面临的另一个问题,当没有标志'N'时,就像上面的情况一样,我希望其他产品保持原样,或者如果它们具有相同的pdct_类型_c,则聚合到一个记录中。客户只是一个普通的varchar类型名称,因此可以是“Ron”或“Greg”,ID字段显示记录都是同一笔交易的一部分,因此在上述情况下,客户的信用额度为60000000美元,并使用单独的产品FX和IC从该额度中提取3000000美元。我的目标是对DERIV产品进行300万美元的合计。最好的办法是编辑您的问题并扩展您的数据示例。从你的评论中我了解到,这主要是为了让案例陈述正确,以选择正确的pdct类型。谢谢,我将继续这样做 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
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