向我解释理解此复杂查询的方法

时间:2019-02-01 13:01:25

标签: mysql sql

任何人都可以帮助我了解这个大的SQL查询。我如何将其分解成小块才能理解?

select t.Instrument as Instrument ,ClearingId as ClearingId,
        ISNULL( PrevQty ,0) AS PrevQty,SettlePrice,
        ISNULL(TodayBuyQty,0) as TodayBuyQty,
        ISNULL( TodaySellQty ,0) AS TodaySellQty, 
        ISNULL(PrevQty +TodayBuyQty-TodaySellQty,0) as NetQty, 
        TodayBuyPrice, TodaySellPrice,LTP,PnL,Token 
from
(
    select Instrument,w.ClearingId as ClearingId,
            ISNULL( PrevQty ,0) AS PrevQty,ISNULL(TodayBuyQty,0) as TodayBuyQty,
            ISNULL( TodaySellQty ,0) AS TodaySellQty, 
            TodayAvgBuyPrice as TodayBuyPrice,TodayAvgSellPrice as TodaySellPrice,
            LTP,PnL,w.Token 
    from
    (
        select Symbol as Instrument, ClearingId,  
                ISNULL(TodayBuyQty,0) as TodayBuyQty, 
                TodayAvgBuyPrice, 
                ISNULL( -TodaySellQty ,0) AS TodaySellQty, 
                TodayAvgSellPrice, NULL as  LTP ,NULL as  PnL , 
                w.Token as Token 
        from
        (
            select Token, sum(Qty) as NetPositionQty, ClearingId,
                    sum(CASE WHEN Qty < 0 THEN Qty ELSE 0 END) as TodaySellQty, 
                    sum(CASE WHEN Qty > 0 THEN Qty ELSE 0 END) as TodayBuyQty,
                    sum(CASE WHEN Qty < 0 THEN Qty * Price ELSE 0 END) 
                    / 
                    NULLIF(sum(CASE WHEN Qty < 0 THEN Qty ELSE 0 END), 0) as TodayAvgSellPrice,
                    sum(CASE WHEN Qty > 0 THEN Qty * Price ELSE 0 END) 
                    / 
                    NULLIF(sum(CASE WHEN Qty > 0 THEN Qty ELSE 0 END), 0) as TodayAvgBuyPrice 
            from
            (
                select m.Token, 
                    (CASE WHEN ClearingId = 'SATP' THEN 'STRAITS' ELSE CASE WHEN ClearingId = 'BATP' THEN 'BPI' ELSE 'UOB' END END ) as ClearingId , 
                    Price/CAST(Multiplier AS float ) as Price,Qty 
                from 
                (
                    select Token , Exchange as ClearingId , 
                            LastTradePrice as Price ,
                            CASE WHEN  Side = 'S' THEN -LastTradeQuantity  ELSE LastTradeQuantity  END as Qty   
                    from Strategy_Orders 
                    where ExchangeStatus in (9,10) )m 
                        JOIN TokenMap t ON ( m.Token = t.Token) 
                    UNION ALL
                    select m.Token, (CASE WHEN ClearingId = 'SATP' THEN 'STRAITS' ELSE CASE WHEN ClearingId = 'BATP' THEN 'BPI' ELSE 'UOB' END END ) as ClearingId , 
                            Price/CAST(Multiplier AS float ) as Price,
                            Qty 
                    from 
                    (
                        select Token , Exchange as ClearingId ,
                                LastTradePrice as Price ,
                                CASE WHEN  Side = 'S' THEN -LastTradeQuantity  ELSE LastTradeQuantity  END as Qty   
                        from Manual_Orders 
                        where ExchangeStatus in (9,10) )m 
                            JOIN TokenMap t ON ( m.Token = t.Token) 
                        UNION ALL
                        select  Token , ClearingId , TodayBuyPrice  , 
                                TodayBuyQty as Qty  
                        from EOD_Holdings 
                        where CurrentDate = 
                            ( select top 1 CurrentDAte from EOD_Holdings 
                              order by CurrentDAte desc 
                    ) 
                    UNION ALL
                    select Token , ClearingId , TodaySellPrice ,
                            TodaySellQty as Qty  
                    from EOD_Holdings 
                    where CurrentDate = ( 
                        select top 1 CurrentDAte from EOD_Holdings 
                        order by CurrentDAte desc 
                        )
                ) x 
            group by Token,ClearingId) w 
                JOIN(select Token, Symbol from TokenMAp ) h on w.Token = h.Token
            ) w  
            FULL OUTER JOIN(
                select Token, PrevQty , ClearingId 
                from EOD_Holdings 
                where CurrentDate = ( select top 1 CurrentDAte from EOD_Holdings order by CurrentDAte desc 
                                    ) 
        ) h 
            on w.Token = h.Token and w.ClearingId = h.ClearingId 
    )t 
    JOIN (
            select * from LatestSettlePrices 
        ) sp 
        on t.Instrument = sp.Instrument

1 个答案:

答案 0 :(得分:0)

您可以通过分别查看每个子查询(“ select ...”)并将其运行以查看结果,将查询分为多个部分。您需要从“ from”或“ where”子句中没有其他select语句的最里面的查询开始。

还请注意,此查询似乎不是一个清晰的方法,也不是最佳解决方案。 您可能要避免使用完整的外部联接,并合并所有语句以获得最佳性能。