【问题标题】:How to take sum of column with same id in SQL? [duplicate]如何在 SQL 中获取具有相同 ID 的列的总和? [复制]
【发布时间】:2012-10-12 17:46:35
【问题描述】:

可能重复:
sql query to sum the data

我有以下表结构

TradeId     TableName        PricingSecurityID  Quantity    Price   
2008        Fireball.dbo.Bond    506             50         100.0000    
2009        Fireball.dbo.Bond    506             50         100.2500    
2010        Fireball.dbo.Bond    588             50         100.7500    
2338        Fireball.dbo.Bond    588             100        102.5000    

我需要对匹配的Quantity 进行总和,或者我们可以说按特定PricingSecurityID 分组

喜欢PricingSecurityID=506 我应该得到quantity=100

对于PricingSecurityID=588,我应该得到quantity=150

如何编写这个 SQL 查询?

我确实尝试过简单的 group by 语句 但由于我也在选择 tradeid 我得到了错误: 选择列表中的“TradeId”列无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

【问题讨论】:

  • 这是一个基本的聚合SUM(Quantity) GROUP BY PricingSecurityID。您需要其他列,还是只需要数量?
  • 三个相等的答案。为了更清晰的stackoverflow,我建议删除第二个和第三个。不过这取决于海报。
  • 更新的问题不是那么简单的朋友请帮助\
  • 不清楚预期的结果是什么。例如tradeId 的哪个值应该与PricingSecurityID=506 一起使用?
  • @ashuthinks 你错了。你说 PricingSecurityId=506 的总和应该是 100,但是你应该看到这个 100 的 TradeId 是什么? 2008 年还是 2009 年?请详细说明,向我们展示您期望的完整结果集,例如 PricingSecurityID=506。

标签: sql sql-server sql-server-2008


【解决方案1】:

修改后的问题——还需要 TradeID。

SELECT f.TradeID, f.PricingSecurityID, s.TotalQuantity
  FROM FollowingTableStructure AS f
  JOIN (SELECT PricingSecurityID, SUM(Quantity) AS TotalQuantity
          FROM FollowingTableStructure
         GROUP BY PricingSecurityId
       ) AS s ON f.PricingSecurityID = s.PricingSecurityID

我并不完全相信这个查询是明智的,但这是你的问题。它可以很容易地扩展到处理其他表;只需添加适当的 JOIN 子句。


请记住在问题中包含表名——令人惊讶的是,SQL 问题被问到的频率却没有给表起名(所以无论如何都不会忘记你)。


重新更新的问题

所以最初的匿名表显然是Fireball.dbo.TradeFireball..Trade。我可能会将 11 路 UNION 放入视图中,因为它可能会在多个地方使用。但是,忽略这一点,我们仍然可以将信息添加到您的查询中:

SELECT t.TradeId, 
       ISNULL(Securities.SecurityType,'Other') SecurityType, 
       Securities.TableName,
       CASE 
       WHEN SecurityTrade.SecurityId IS NOT NULL THEN SecurityTrade.SecurityId
       ELSE Trade.SecurityId
       END AS PricingSecurityID,
       s.TotalQuantity AS Quantity,
       t.Price,
       CASE
       WHEN (t.Buy = 1 AND t.Long = 1) THEN 1
       WHEN (t.Buy = 0 AND t.Long = 0) THEN 1
       ELSE 0
       END AS Position
  FROM Fireball_Reporting..Trade AS t
  JOIN (SELECT PricingSecurityID, SUM(Quantity) AS TotalQuantity
          FROM Fireball_Reporting..Trade
         GROUP BY PricingSecurityId
       ) AS s ON t.PricingSecurityID = s.PricingSecurityID
  LEFT JOIN
       (SELECT TradeId, 'Bond' SecurityType, 'Fireball.dbo.Bond' TableName FROM Fireball..CorpBondTrade
        UNION
        SELECT TradeId, 'IRS' SecurityType, 'Fireball.dbo.Bond' TableName FROM Fireball..IRPTrade
        UNION
        SELECT TradeId, 'Treasury' SecurityType, 'Fireball.dbo.Bond' TableName FROM Fireball..TreasuryTrade
        UNION
        SELECT TradeId, 'Index' SecurityType, 'Fireball.dbo.CDSIndex' TableName FROM Fireball..CreditIndexTrade
        UNION
        SELECT TradeId, 'CDS' SecurityType, 'Fireball.dbo.CDS' TableName FROM Fireball..CDSTrade WHERE IsSovereign = 0
        UNION
        SELECT TradeId, 'Sovereign CDS' SecurityType, 'Fireball.dbo.CDS' TableName FROM Fireball..CDSTrade WHERE IsSovereign = 1
        UNION
        SELECT TradeId, 'Equity Option' SecurityType, 'Fireball.dbo.EquityOption' TableName FROM Fireball..EquityOptionTrade
        UNION
        SELECT TradeId, 'Equity' SecurityType, 'Fireball.dbo.Equity' TableName FROM Fireball..EquityTrade
        UNION
        SELECT TradeId, 'Loan' SecurityType, 'Fireball.dbo.Loan' TableName FROM Fireball..LoanTrade
        UNION
        SELECT TradeId, 'Swaption' SecurityType, 'Fireball.dbo.Bond' TableName FROM Fireball..SwaptionTrade
        UNION
        SELECT TradeId, 'Preferred Stock' SecurityType, 'Fireball.dbo.Bond' TableName FROM Fireball..PreferredEquityTrade
        --UNION
        --SELECT TradeId, 'Bond' SecurityType FROM Fireball..BondTrade
       ) AS Securities ON Securities.TradeId = t.TradeId
  LEFT JOIN
       (SELECT TradeID, SecurityId 
          FROM Fireball..CDSTrade 
        UNION
        SELECT TradeID, SecurityId 
         FROM Fireball..CreditIndexTrade          
       ) AS SecurityTrade ON SecurityTrade.TradeId = t.TradeId

这主要是对您的查询进行复制和粘贴(经过一些重新格式化),额外的子查询隐藏在 Trade 表之后的 FROM 子句中。如果是我的查询,我也会对最后两个子查询使用单字母(或其他短助记符)别名;我只是没有花时间研究什么是 SecurityTrade 和 Securities 的适当缩写。

【讨论】:

    【解决方案2】:
    select PricingSecurityID, sum(Quantity)
    from table
    group by PricingSecurityID
    

    【讨论】:

    • 谢谢!这很好,很短!
    【解决方案3】:
    select PricingSecurityID, sum(quantity)
    from Fireball.dbo.Bond
    group by PricingSecurityID
    

    【讨论】:

      【解决方案4】:
      SELECT PricingSecurityID, SUM(ISNULL(Quantity,0))
        FROM Table
       GROUP BY PricingSecurityId;
      

      【讨论】:

      • ISNULL 在这里不是必需的;不会包含任何为 null 的值,SUM 将是相同的。
      • 更新的问题不是那么简单的朋友请帮助\谢谢
      • @LittleBobbyTables:ISNULL(SUM(Quantity),0) 很常见,但如果列中只有空值(对于一个组)。
      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-03
      • 1970-01-01
      • 2015-09-02
      • 1970-01-01
      • 2018-05-30
      相关资源
      最近更新 更多