繁体   English   中英

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

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

我有一个SQL查询,它将两个类似的查询连接到一个临时表中。 然后,我从该单个临时表构建结果集。

最终结果集的一部分应包括“ Equities”和“ Options”的行数。 为了解决这个问题,我添加了硬编码列。

粗略/简化的ERD看起来像这样: 在此处输入图片说明

股票在EquityType列中具有硬编码1,期权在OptionType列中具有硬编码1。 顺便说一句,TH.Type列还包含唯一值,以区分行与Equity或Option(值将为'Equity'或'Option')。

我觉得我的解决方案充其量是hack。 并且必须有更好的选择。

我的sql用于MySql,但是我不认为答案是特定于数据库的。 这是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;

我的问题是:如何在第3步中获得EquityTrades的值,而无需在SQL语句的第1步和第2步中添加硬编码列。

例如,这些列:

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

Thnx,马特

编辑下面的更新的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;

要聚合联合,这是基本格式:

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

不用使用EquityTypeOptionType列,而只需使用Type列。

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

您的第二个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