10

重複の可能性:
データを合計する sql クエリ

次のテーブル構造があります

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 句のいずれにも含まれていないため、選択リストでは無効です。

4

4 に答える 4

16

改訂された質問 — 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.TradeまたはFireball..Tradeです。複数の場所で使用される可能性が高いため、11-way 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 句に隠されています。それが私のクエリであれば、最後の 2 つのサブクエリにも 1 文字 (または他の短いニーモニック) のエイリアスを使用することになります。SecurityTrade と Securities の適切な略語を考えるのに時間を費やしませんでした。

于 2012-10-12T17:49:29.413 に答える
12
select PricingSecurityID, sum(Quantity)
from table
group by PricingSecurityID
于 2012-10-12T17:48:45.113 に答える
11
select PricingSecurityID, sum(quantity)
from Fireball.dbo.Bond
group by PricingSecurityID
于 2012-10-12T17:49:13.157 に答える
7
SELECT PricingSecurityID, SUM(ISNULL(Quantity,0))
  FROM Table
 GROUP BY PricingSecurityId;
于 2012-10-12T17:56:29.547 に答える