Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie nimmt man die Summe der Spalte mit derselben ID in SQL?

Überarbeitete Frage – die TradeID wird ebenfalls benötigt.

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

Ich bin nicht ganz davon überzeugt, dass die Abfrage sinnvoll ist, aber das ist Ihr Problem. Es kann leicht erweitert werden, um mit anderen Tabellen umzugehen; Fügen Sie einfach die entsprechenden JOIN-Klauseln hinzu.

Bitte denken Sie daran, einen Tabellennamen in die Frage aufzunehmen – es ist erstaunlich, wie oft SQL-Fragen gestellt werden, ohne der Tabelle einen Namen zu geben (also sind es nicht nur Sie, die es auf jeden Fall vergessen).

Frage neu aktualisiert

Die ursprünglich anonyme Tabelle ist also anscheinend Fireball.dbo.Trade oder Fireball..Trade . Ich würde die 11-Wege-UNION wahrscheinlich in einer Ansicht platzieren, da sie wahrscheinlich an mehreren Stellen verwendet wird. Wenn Sie dies jedoch ignorieren, können wir die Informationen dennoch in Ihre Abfrage einfügen:

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

Das ist meistens Kopieren und Einfügen – mit etwas Neuformatierung – Ihrer Abfrage, wobei die zusätzliche Unterabfrage in der FROM-Klausel nach der Trade-Tabelle versteckt ist. Wäre es meine Abfrage, würde ich auch für die letzten beiden Unterabfragen Aliase aus einem einzelnen Buchstaben (oder anderen kurzen mnemonischen) verwenden; Ich habe mir einfach nicht die Zeit genommen, herauszufinden, was angemessene Abkürzungen für SecurityTrade und Securities sind.