Объясните мне способы понять этот сложный запрос - PullRequest
0 голосов
/ 01 февраля 2019

Может кто-нибудь помочь мне понять этот большой 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 голосов
/ 01 февраля 2019

Вы можете разбить запрос на куски, посмотрев каждый подзапрос («выбрать ...») отдельно и запустив их, чтобы увидеть результаты.Вам нужно начать с самых внутренних запросов, которые не имеют других операторов выбора в предложении «from» или «where».

Также обратите внимание, что этот запрос не является ни ясным, ни оптимальным решением.Вы хотели бы избежать использования полных внешних объединений и объединять все операторы для лучшей производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...