向查询和子查询添加其他SQL逻辑/转换

时间:2018-08-15 14:45:21

标签: sql transformation case-when data-extraction

我对如何解决这个问题有些困惑,并且没有太多运气找到真正能解决这个问题的答案。

我想获取一组交易数据,从带有很多干扰的列中提取基础公司的名称,然后将该名称与该特定交易的买入或卖出相结合。

然后,我想看看同时存在公司买卖的每个实例,如果有,则将“买卖”标记为“是”,将“买卖”标记为“卖出”。因此,如果我有17笔“ Pepsi_Buy”交易和1笔“ Pepsi_Sell”交易,则每笔交易“ Pepsi_Buy”都会得到“是”,而1笔“ Pepsi_Sell”将会得到“卖出”标签。

如果我所有的都是'Pepsi_Buy',而没有'Pepsi_Sell',那么他们都会收到一个“ NO”标签;或者,如果我只有“ Pepsi_Sell”,那么它也会收到一个“ NO”。

我已经能够解析出基础的公司名称,然后对CASE WHEN转换产生的所有结果进行计数。现在,我开始着手下一步工作。

这是我的代码,如果可以帮助您提供一些上下文信息,请先感谢vm,感谢您对贤哲的见识!

SELECT UR.underlying_reference, 
   Count(*) AS NUMBER_MATCHES 

FROM   (SELECT CASE 
             WHEN Trade_Record IS NULL THEN NULL 
             WHEN Charindex('/', Trade_Record, 1) = 0 THEN 
             Substring(Trade_Record, (Charindex(' on ', Trade_Record 
             , 1)+4) , Charindex('.', Trade_Record, (Charindex(' on ', 
Trade_Record,1)+4)) 
             - (Charindex(' on ', Trade_Record, 1)+4)) 
             + '_' + BUY_SELL_FLAG 
             ELSE Substring(Trade_Record, (Charindex(' on ', 
                  Trade_Record,1)+4),Charindex('/', Trade_Record, 
(Charindex(' on ', 
                  Trade_Record, 1)+4)) - (Charindex(' on ', Trade_Record, 
1)+4)) 
                  + '_' + BUY_SELL_FLAG 
           END AS UNDERLYING_REFERENCE 
    FROM   tradeTable
    WHERE  recordDate = '6/29/2018' 
           AND BUY_SELL_FLAG IS NOT NULL) UR 
GROUP  BY UR.underlying_reference   
ORDER BY UR.underlying_reference ASC

此表将是我想要的结果。我已经有了Company + BuySell领域,但是MatchingLogic是我要解决的问题

Company+BuySell Combine Matching Logic
PEPSI CO _Buy   Y
PEPSI CO _Buy   Y
PEPSI CO _Buy   Y
PEPSI CO _Buy   Y
PEPSI CO _Sell  Sold
PEPSI CO _Sell  Sold

COCA COLA_Sell  Sold
COCA COLA_Sell  Sold
COCA COLA_Sell  Sold
COCA COLA_Sell  Sold

MCDs_Buy    N
MCDs_Buy    N
MCDs_Buy    N
MCDs_Buy    N
MCDs_Buy    N
MCDs_Buy    N

DRP_Buy     Y
DRP_Sell    Sold
DRP_Sell    Sold
DRP_Sell    Sold
DRP_Sell    Sold
DRP_Sell    Sold
DRP_Sell    Sold

1 个答案:

答案 0 :(得分:0)

我将使用ANSI / ISO标准窗口函数:

select t.*,
       (case when num_buys = 0 or num_sells = 0 then 'No'
             when buy_sell_flag = '_buy' then 'Yes'
             when buy_sell_flag = '_sell' then 'Sold'
        end) as derived_logic
from (select t.*,
             sum(case when buy_sell_flag = '_buy' then 1 else 0 end) as num_buys,
             sum(case when buy_sell_flag = '_sell' then 1 else 0 end) as num_sells
      from t
     ) t;

子查询不是严格必需的,但我认为它使逻辑更具可读性。