Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak wziąć sumę kolumny o tym samym identyfikatorze w SQL?

Poprawione pytanie — TradeID jest również potrzebny.

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

Nie jestem do końca przekonany, że zapytanie jest sensowne, ale to twój problem. Można go łatwo rozszerzyć, aby poradzić sobie z innymi stołami; po prostu dodaj odpowiednie klauzule JOIN.

Pamiętaj, aby w pytaniu umieścić nazwę tabeli — zadziwiające jest, jak często pytania SQL są zadawane bez podawania nazwy tabeli (a więc nie tylko Ty zapominasz w jakikolwiek sposób).

Ponownie zaktualizowane pytanie

Tak więc pierwotnie anonimowa tabela to najwyraźniej Fireball.dbo.Trade lub Fireball..Trade . Prawdopodobnie umieściłbym 11-kierunkowy UNION w widoku, ponieważ prawdopodobnie będzie używany w wielu miejscach. Jednak ignorując to, nadal możemy wstawić informacje do Twojego zapytania:

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

Jest to głównie kopiowanie i wklejanie — z pewnym przeformatowaniem — zapytania, z dodatkowym podzapytaniem schowanym w klauzuli FROM za tabelą Trade. Gdyby to było moje zapytanie, użyłbym jednoliterowych (lub innych krótkich mnemonicznych) aliasów również dla dwóch ostatnich podzapytań; Po prostu nie spędziłem czasu na zastanawianiu się, jakie są odpowiednie skróty dla handlu papierami wartościowymi i papierami wartościowymi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Procedura składowana lub funkcja oczekuje parametru, który nie jest dostarczany

  2. Baza danych nie jest aktualizowana metodą Attach

  3. Jeśli rekord istnieje, zaktualizuj inną wstawkę

  4. Wyzwalacz aktualizujący tylko wstawiony wiersz

  5. TSQL porównujący dwa zestawy