【问题标题】:Grouping Rows based on two columns and including an aggregated column基于两列并包括聚合列对行进行分组
【发布时间】:2021-10-06 03:25:43
【问题描述】:

很抱歉很难创建一个描述性的主题,但这里是对我正在尝试做的事情的解释:

这是我拥有的数据的形状:

所以对于EffectiveDates的每一组,如果有多行具有相同的SecGlobalId并且他们的SecType只有“CASH”,我想结合他们@的总和987654328@ 并且只有 ONE 行仅用于那些,例如,对于 24 日,我想为 USD 设置一行,其 Cost 列的值为 23.45 + 10.00 = 33.45,然后在 25 日设置另一行为 140.23 + 45.41

这是我创建的示例脚本,我尝试进行分组,但这是不对的。所以我不确定如何解决它。

CREATE TABLE #Practice
(
    SecGlobalID INT, 
    Name NVARCHAR(50), 
    EffectiveDate DATE,  
    Cost DECIMAL(20,2), 
    SecType NVARCHAR(5)
);

INSERT INTO #Practice (SecGlobalID, Name, Cost, EffectiveDate, SecType)
VALUES 
 (1234, 'USD', 23.45,  '2021-07-24', 'CASH')
 ,(1234, 'USD', 10.00,  '2021-07-24', 'CASH')
 ,(789, 'Tesla', 564.72,  '2021-07-24', 'STOCK')
 ,(5223, 'Starbucks', 4534.12,  '2021-07-24', 'STOCK')
 ,(9987, 'GER', 50.00,  '2021-07-24', 'CASH')

 ,(1234, 'USD', 140.23,  '2021-07-25', 'CASH')
 ,(1234, 'USD', 45.41,  '2021-07-25', 'CASH')
 ,(9987, 'GER', 5.4,  '2021-07-25', 'CASH')

 ,(43342, 'Security1', 3670.14,  '2021-07-26', 'STOCK')
 ,(7777, 'Security2', 66.35,  '2021-07-26', 'CASH')
 
SELECT SecGlobalID, Name, EffectiveDate, SUM(Cost), SecType 
FROM #Practice
GROUP BY SecGlobalID, Name, EffectiveDate,  SecType

DROP TABLE #Practice

所以这里是预期结果的截图:

【问题讨论】:

  • 显示你想要的结果真的很有帮助!
  • @GordonLinoff 好的,我也添加了预期结果的屏幕截图。
  • @UnskilledCoder:你得到的代码不是一样的(根据预期结果的截图)?还是您的预期结果是别的?
  • @huMptyduMpty :几乎是的......但我想更有条件地说,仅当类型为“现金”时才应用 SUM,而不要将 SUM 应用于其他类型的钱。跨度>
  • @UnskilledCoder:可能是您在总结案例陈述之后。已回答

标签: sql-server tsql sum case window-functions


【解决方案1】:

您可以在CASE 表达式中使用SUM() 窗口函数:

SELECT DISTINCT
       SecGlobalID, Name, 
       CASE 
         WHEN SecType <> 'CASH' THEN Cost
         ELSE SUM(CASE WHEN SecType = 'CASH' THEN Cost END) OVER (PARTITION BY SecGlobalID, EffectiveDate) 
       END Cost, 
       EffectiveDate, SecType
FROM Practice

请参阅demo

【讨论】:

  • 谢谢。我知道我需要一个窗口功能,但仍然不知道如何使用它们。我刚刚订购了一本关于 Window 函数的书 :) 该主题是我的一周重点。
【解决方案2】:
SELECT SecGlobalID, Name, EffectiveDate, SUM(CASE WHEN SecType= 'CASH' THEN Cost ELSE 0 END), SecType 
FROM #Practice
GROUP BY SecGlobalID, Name, EffectiveDate,  SecType
Order by EffectiveDate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    相关资源
    最近更新 更多