sql >> Databáze >  >> RDS >> Sqlserver

Jak vzít součet sloupce se stejným ID v SQL?

Upravená otázka – je také potřeba 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

Nejsem zcela přesvědčen, že je dotaz smysluplný, ale to je váš problém. Lze jej snadno rozšířit o další tabulky; stačí přidat příslušné klauzule JOIN.

Nezapomeňte do otázky zahrnout název tabulky – je udivující, jak často jsou dotazy SQL kladeny bez uvedení názvu tabulky (takže nejen vy zapomínáte v žádném případě).

Znovu aktualizovaná otázka

Takže původně anonymní tabulka je zřejmě Fireball.dbo.Trade nebo Fireball..Trade . Pravděpodobně bych umístil 11-way UNION do pohledu, protože je pravděpodobné, že bude použit na více místech. I když to však ignorujeme, stále můžeme vložit informace do vašeho dotazu:

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

To je většinou zkopírování a vložení – s určitým přeformátováním – vašeho dotazu, přičemž další dílčí dotaz je zastrčený v klauzuli FROM za tabulkou Trade. Kdyby to byl můj dotaz, použil bych jednopísmenné (nebo jiné krátké mnemotechnické) aliasy i pro poslední dva dílčí dotazy; Jen jsem nestrávil čas hledáním vhodných zkratek pro SecurityTrade a Securities.



  1. Jak se vyhnout chybě dělení nulou v SQL?

  2. Objekty sady dotazů Django vracejí žádné místo 0, přestože databáze má jako hodnotu pole uloženu 0

  3. SQLSTATE[HY000] [2005] Neznámý hostitel serveru MySQL 'mysql1.alwaysdata.com:3306' (2)

  4. Používáte LIMIT v rámci GROUP BY k získání N výsledků na skupinu?