简体   繁体   English

如何计算GROUP BY SQL中的特定行

[英]How do I count specific rows in GROUP BY SQL

I have an SQL query that joins two similar queries into a single temporary table. 我有一个SQL查询,它将两个类似的查询连接到一个临时表中。 I then build a result set from that single temporary table. 然后,我从该单个临时表构建结果集。

Part of the final result set should include count of which rows are "Equities" and "Options". 最终结果集的一部分应包括“ Equities”和“ Options”的行数。 To solve this I added hard coded columns. 为了解决这个问题,我添加了硬编码列。

A rough/simplified ERD looks like this: 粗略/简化的ERD看起来像这样: 在此处输入图片说明

Equities have a hard coded 1 in EquityType column and Options have a hard coded 1 in the OptionType column. 股票在EquityType列中具有硬编码1,期权在OptionType列中具有硬编码1。 By the way, the TH.Type column also contains unique values to distinguish a row from Equity or Option (values will be either 'Equity' or 'Option'). 顺便说一句,TH.Type列还包含唯一值,以区分行与Equity或Option(值将为'Equity'或'Option')。

I feel my solution is, at best, a hack; 我觉得我的解决方案充其量是hack。 and there has to be better alternative. 并且必须有更好的选择。

My sql is for MySql, but I do not believe the answer is database specific. 我的sql用于MySql,但是我不认为答案是特定于数据库的。 Here's the sql: 这是SQL:

-- step 1 get equities
CREATE TEMPORARY TABLE IF NOT EXISTS PositionDetails AS
    (
    SELECT TH.Id,
        TH.Symbol,
        TH.TransactionDate,
        TH.Type,
        1 AS 'EquityType',
        0 AS 'OptionType',
        TH.State,
        TH.Position,
        TE.Shares AS Units,
        TE.SharePrice AS UnitPrice,
        TE.Commission,
        TE.Action,
        '' AS 'Data',
        0 AS StrikePrice,
        '' AS 'ExtendedType'
    FROM TradeHeader TH 
    LEFT JOIN TradeEquity TE ON TE.TradeId = TH.Id    
    WHERE TH.Type = 'Equity' AND TH.State = 'Open'
    );

-- step 2 get options
CREATE TEMPORARY TABLE IF NOT EXISTS PositionDetails AS
    (
    SELECT TH.Id,
        TH.Symbol,
        TH.TransactionDate,
        TH.Type,
        0 AS 'EquityType',
        1 AS 'OptionType',        
        TH.State,
        TH.Position,
        TOP.Contracts AS Units,
        TOP.UnitPrice,
        TOP.Commission,
        TOP.Action,
        TOP.ExpirationDate AS 'Data',
        TOP.StrikePrice AS StrikePrice,
        TOP.OptionType AS 'ExtendedType'
    FROM TradeHeader TH
    LEFT JOIN TradeOption TOP ON TOP.TradeId = TH.Id
    WHERE TH.Type = 'Option' AND TH.State = 'Open'
    );

-- step 3 summarize the data    
SELECT 
    PD.Symbol    
  , MIN(PD.TransactionDate) AS FirstTrans
  , MAX(PD.TransactionDate) AS MostRecentTrans
  , SUM((PD.Units * PD.UnitPrice) + PD.Commission) AS Cost
  , COUNT(PD.Symbol) AS Transactions
  , SUM(PD.EquityType) As EquityTrades
  , Sum(PD.OptionType) AS OptionTrades
FROM PositionDetails PD 
GROUP BY PD.Symbol
ORDER BY PD.Symbol;

My question is: how can I get the values for EquityTrades in step 3, without the hardcoded columns I added in my SQL statements step 1 and step 2. 我的问题是:如何在第3步中获得EquityTrades的值,而无需在SQL语句的第1步和第2步中添加硬编码列。

eg, these columns: 例如,这些列:

0 AS 'EquityType',
1 AS 'OptionType', 

Thnx, Matt Thnx,马特

EDIT Updated SQL below: 编辑下面的更新的SQL:

CREATE TEMPORARY TABLE IF NOT EXISTS PositionDetails AS
    (
    SELECT 
        TH.Id
      , TH.Symbol
      , TH.TransactionDate
      , TH.Type
      , TH.State
      , TH.Position
      , TE.Shares AS Units
      , TE.SharePrice AS UnitPrice
      , TE.Commission
      , TE.Action
      , '' AS 'Data'
      , 0 AS StrikePrice
      , '' AS 'ExtendedType'
    FROM TradeHeader TH 
    LEFT JOIN TradeEquity TE ON TE.TradeId = TH.Id    
    WHERE TH.Type = 'Equity' AND TH.State = 'Open'
    );

INSERT INTO PositionDetails 

    SELECT 
        TH.Id
      , TH.Symbol
      , TH.TransactionDate
      , TH.Type
      , TH.State
      , TH.Position
      , TOP.Contracts AS Units
      , TOP.UnitPrice
      , TOP.Commission
      , TOP.Action
      , TOP.ExpirationDate AS 'Data'
      , TOP.StrikePrice AS StrikePrice
      , TOP.OptionType AS 'ExtendedType'    
    FROM TradeHeader TH
    LEFT JOIN TradeOption TOP ON TOP.TradeId = TH.Id
    WHERE TH.Type = 'Option' AND TH.State = 'Open'
    ;


SELECT 
    PD.Symbol    
  , MIN(PD.TransactionDate) AS FirstTrans
  , MAX(PD.TransactionDate) AS MostRecentTrans
  , SUM((PD.Units * PD.UnitPrice) + PD.Commission) AS Cost
  , COUNT(PD.Symbol) AS Transactions
  , SUM(PD.Type = 'Equity') As EquityTrades
  , Sum(PD.Type <> 'Equity') AS OptionTrades
FROM PositionDetails PD 
GROUP BY PD.Symbol
ORDER BY PD.Symbol;

To aggregate a union, this is the basic format: 要聚合联合,这是基本格式:

SELECT ..., SUM(subU.someValueField)
FROM (
   ... 
   UNION 
   ...
) AS subU
GROUP BY subU.Xfield, subU.Yfield

Instead of using the EquityType and OptionType columns, just use the Type column. 不用使用EquityTypeOptionType列,而只需使用Type列。

SUM(type = 'Equity') AS EquityTrades,
SUM(type = 'Option') AS OptionTrades

Your second CREATE TEMPORARY TABLE query should be an INSERT INTO PositionDetails , since the table already exists from the first query. 您的第二个CREATE TEMPORARY TABLE查询应该是INSERT INTO PositionDetails ,因为该表已经存在于第一个查询中。

CREATE TEMPORARY TABLE PositionDetails AS
    (
    SELECT TH.Id,
        TH.Symbol,
        TH.TransactionDate,
        TH.Type,
        TH.State,
        TH.Position,
        TE.Shares AS Units,
        TE.SharePrice AS UnitPrice,
        TE.Commission,
        TE.Action,
        '' AS 'Data',
        0 AS StrikePrice,
        '' AS 'ExtendedType'
    FROM TradeHeader TH 
    LEFT JOIN TradeEquity TE ON TE.TradeId = TH.Id    
    WHERE TH.Type = 'Equity' AND TH.State = 'Open'
    );

INSERT INTO PositionDetails
SELECT TH.Id,
    TH.Symbol,
    TH.TransactionDate,
    TH.Type,
    TH.State,
    TH.Position,
    TOP.Contracts AS Units,
    TOP.UnitPrice,
    TOP.Commission,
    TOP.Action,
    TOP.ExpirationDate AS 'Data',
    TOP.StrikePrice AS StrikePrice,
    TOP.OptionType AS 'ExtendedType'
FROM TradeHeader TH
LEFT JOIN TradeOption TOP ON TOP.TradeId = TH.Id
WHERE TH.Type = 'Option' AND TH.State = 'Open';

SELECT 
    PD.Symbol    
  , MIN(PD.TransactionDate) AS FirstTrans
  , MAX(PD.TransactionDate) AS MostRecentTrans
  , SUM((PD.Units * PD.UnitPrice) + PD.Commission) AS Cost
  , COUNT(*) AS Transactions
  , SUM(PD.Type = 'Equity') As EquityTrades
  , Sum(PD.Type = 'Option') AS OptionTrades
FROM PositionDetails PD 
GROUP BY PD.Symbol
ORDER BY PD.Symbol;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM