【问题标题】:SQL Server Aggregation Using Partitioning使用分区的 SQL Server 聚合
【发布时间】:2017-07-14 14:30:42
【问题描述】:

我在编写 SQL 查询以基于类似 ID 组汇总多个余额并显示带有 N 标志的产品的余额时遇到了麻烦。我想我需要使用分区函数或最大函数来执行此操作.

所需的结果位于示例数据集下方的下表中。有人可以解决这个问题吗?

有人知道逻辑可以帮助解决这个问题吗?基本上我需要按 ID 对所有内容进行分组,如果有 N 标志,则将余额滚动到该记录,如果没有标志为 N 的记录,我们只需按 pdct_Type_C 聚合。

选择
客户,
SUM(限制) 限制,
SUM(余额) 余额,
SUM(曝光)曝光,
MAX(CASE WHEN Flag = 'N' THEN Pdct_type_c ELSE NULL END) Pdct_type_c,
ID
FROM
GROUP BY 客户,ID

样本数据集

客户 |限制 |余额 |曝光 | Pdct_type_c |旗帜 | ID -------------------------------------------------- ------------------------------ 约翰 | 60,000,000.00| - | 5,000,000|衍生 | N | 2 约翰 | - | 1,000,000.00 | - |外汇 |是 | 2 约翰 | - | 2,000,000.00 | - |集成电路 |是 | 2 约翰 | 1,000,000.00 | 3,000,000.00 | - |数据中心 |是 | 3 约翰 | 1,000,000.00 | 3,000,000.00 | - |数据中心 |是 | 3

目前的结果

客户 |限制 |余额 |曝光 | Pdct_type_c |旗帜 | ID -------------------------------------------------- ------------------------------ 约翰 | 60,000,000.00| 3,000,000.00 | 5,000,000|衍生 | N | 2 约翰 | 2,000,000.00 | 6,000,000.00 | - |空 |是 | 3

期望的结果

客户 |限制 |余额 |曝光 | Pdct_type_c |旗帜 | ID -------------------------------------------------- ------------------------------ 约翰 | 60,000,000.00| 3,000,000.00 | 5,000,000|衍生 | N | 2 约翰 | 2,000,000.00 | 6,000,000.00 | - |数据中心 |是 | 3

【问题讨论】:

  • 您需要向我们展示您的尝试。最基本的(假设您的样本代表所有数据)您需要使用GROUP BY,这是一个相当简单的查询。此外,您不应该将数据作为图片发布。将其作为文本包含在实际问题中。见:stackoverflow.com/help/how-to-ask
  • 谢谢,我已经发布了一个基本数据集,其中包含我正在寻找的结果。基本上,我希望根据相同的 ID 聚合组,并将余额汇总到该组中的客户端,并带有 flag = 'N' 。

标签: sql-server


【解决方案1】:

这完全有可能通过窗口函数实现。然而,这是老式的做法

这仅向我们显示具有 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 

【讨论】:

  • 这是我遇到的另一个问题,当没有“N”标志时,如上所述,我希望其他产品保持原样,或者如果它们具有相同的 pdct_type_c 然后汇总为一条记录。 Client 只是一个普通的 varchar 类型名称,因此可以是 'Ron' 或 'Greg' ,ID 字段显示记录都是同一交易的一部分,因此如果上述客户的信用额度为 60,000,000 美元并已提取该限额中的 3,000,000 美元,使用单独的产品(FX 和 IC)。我的目标是让 DERIV 产品获得 3,000,000 美元的总额。
  • 最好的办法是编辑您的问题并扩展您的数据示例。根据我从您的评论中了解到的情况,主要是为了让案例陈述正确以挑选出正确的 pdct_type_c
  • 谢谢,我会继续这样做
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 2022-08-03
  • 2012-09-24
  • 2010-09-26
  • 1970-01-01
  • 2021-10-21
相关资源
最近更新 更多