Есть ли способ уменьшить этот CTE с помощью функций или аналогичных? (большой запрос) - PullRequest
1 голос
/ 25 марта 2020

У меня есть запрос для анализа данных в таблице, таблица имеет огромное количество полей, и мне нужно попытаться найти способ упростить ее работу.

У меня есть этот базовый c запрос, который возвращает информацию о скачках и предоставляет информацию о датах и ​​результатах гонок.

SELECT 
td.EVENT_ID, 
       td.MENU_HINT, 
       td.EVENT_NAME,
       td.BSP,
       td.EVENT_DT AS Expr1003, 
       td.WIN_LOSE,
       (SELECT count(*) FROM dbo.tblData td2 WHERE td2.EVENT_ID =td.EVENT_ID) AS [CountRunners],
       SUM(CASE WHEN td.EVENT_ID = td.EVENT_ID THEN 1  END) AS [Total Runners], 
       SUM(CASE WHEN td.WIN_LOSE = 1 THEN td.BSP  END) AS [WinnerPrice],
       SUM(CASE WHEN td.WIN_LOSE = 1 THEN 1 END) AS [WinnerCount],
       td.[Race No] AS RaceNo, 
       replace(LEFT(SUBSTRING(td.EVENT_NAME, CHARINDEX(' ', td.EVENT_NAME) + 1, LEN(td.EVENT_NAME)), CHARINDEX(' ', SUBSTRING(td.EVENT_NAME, CHARINDEX(' ', td.EVENT_NAME) + 2, LEN(td.EVENT_NAME)))),'m','') AS Distance, 
       REVERSE(LEFT(REVERSE(td.EVENT_NAME), CHARINDEX(' ', REVERSE(td.EVENT_NAME)) - 1)) AS Class, 
       FORMAT(CONVERT(DATETIME, td.EVENT_DT, 103), 'dddd') AS [Day],
       DATEPART(WEEKDAY, CONVERT(DATETIME, td.EVENT_DT, 103)) AS [DayNumber]
FROM tblData td
--WHERE td.EVENT_ID IN(144705336)
GROUP BY td.EVENT_ID, 
         td.MENU_HINT, 
         td.EVENT_NAME, 
         td.BSP,
         td.EVENT_DT, 
         td.[Race No],
         td.WIN_LOSE

╔═══════════╦══════════════════════════╦═══════════════╦════════╦════════════╦══════════╦══════════════╦═══════════════╦═════════════╦═════════════╦════════╦══════════╦═══════╦════════╦═══════════╗
║  EVENT_ID ║ MENU_HINT                ║ EVENT_NAME    ║ BSP    ║ Expr1003   ║ WIN_LOSE ║ CountRunners ║ Total Runners ║ WinnerPrice ║ WinnerCount ║ RaceNo ║ Distance ║ Class ║ Day    ║ DayNumber ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386456 ║ AUS / Flem (AUS) 1st Jan ║ R1 1000m 2yo  ║ 4.75   ║ 2018-01-01 ║ 1        ║ 7            ║ 1             ║ 4.75        ║ 1           ║ 1      ║ 1000     ║ 2yo   ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386456 ║ AUS / Flem (AUS) 1st Jan ║ R1 1000m 2yo  ║ 5.01   ║ 2018-01-01 ║ 0        ║ 7            ║ 1             ║ NULL        ║ NULL        ║ 1      ║ 1000     ║ 2yo   ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386456 ║ AUS / Flem (AUS) 1st Jan ║ R1 1000m 2yo  ║ 5.60   ║ 2018-01-01 ║ 0        ║ 7            ║ 1             ║ NULL        ║ NULL        ║ 1      ║ 1000     ║ 2yo   ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386456 ║ AUS / Flem (AUS) 1st Jan ║ R1 1000m 2yo  ║ 7.80   ║ 2018-01-01 ║ 0        ║ 7            ║ 1             ║ NULL        ║ NULL        ║ 1      ║ 1000     ║ 2yo   ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386456 ║ AUS / Flem (AUS) 1st Jan ║ R1 1000m 2yo  ║ 8.70   ║ 2018-01-01 ║ 0        ║ 7            ║ 1             ║ NULL        ║ NULL        ║ 1      ║ 1000     ║ 2yo   ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386456 ║ AUS / Flem (AUS) 1st Jan ║ R1 1000m 2yo  ║ 8.88   ║ 2018-01-01 ║ 0        ║ 7            ║ 1             ║ NULL        ║ NULL        ║ 1      ║ 1000     ║ 2yo   ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386456 ║ AUS / Flem (AUS) 1st Jan ║ R1 1000m 2yo  ║ 16.50  ║ 2018-01-01 ║ 0        ║ 7            ║ 1             ║ NULL        ║ NULL        ║ 1      ║ 1000     ║ 2yo   ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386458 ║ AUS / Flem (AUS) 1st Jan ║ R2 1400m Hcap ║ 3.52   ║ 2018-01-01 ║ 1        ║ 8            ║ 1             ║ 3.52        ║ 1           ║ 2      ║ 1400     ║ Hcap  ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386458 ║ AUS / Flem (AUS) 1st Jan ║ R2 1400m Hcap ║ 5.00   ║ 2018-01-01 ║ 0        ║ 8            ║ 1             ║ NULL        ║ NULL        ║ 2      ║ 1400     ║ Hcap  ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386458 ║ AUS / Flem (AUS) 1st Jan ║ R2 1400m Hcap ║ 5.63   ║ 2018-01-01 ║ 0        ║ 8            ║ 1             ║ NULL        ║ NULL        ║ 2      ║ 1400     ║ Hcap  ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386458 ║ AUS / Flem (AUS) 1st Jan ║ R2 1400m Hcap ║ 5.92   ║ 2018-01-01 ║ 0        ║ 8            ║ 1             ║ NULL        ║ NULL        ║ 2      ║ 1400     ║ Hcap  ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣
║ 138386458 ║ AUS / Flem (AUS) 1st Jan ║ R2 1400m Hcap ║ 12.52  ║ 2018-01-01 ║ 0        ║ 8            ║ 1             ║ NULL        ║ NULL        ║ 2      ║ 1400     ║ Hcap  ║ Monday ║ 2         ║
╠═══════════╬══════════════════════════╬═══════════════╬════════╬════════════╬══════════╬══════════════╬═══════════════╬═════════════╬═════════════╬════════╬══════════╬═══════╬════════╬═══════════╣

Теперь для этого мне нужно создать новый набор столбцов для рассчитать большой набор категорий и комбинаций для разных ценовых категорий, количества бегунов, дистанции, номера гонки и т. д. c. Я вставлю небольшое подмножество большого запроса, который я сделал с помощью CTE:

 WITH CTE_TblData as(
SELECT 
td.EVENT_ID, 
       td.MENU_HINT, 
       td.EVENT_NAME,
       td.BSP,
       td.EVENT_DT AS Expr1003, 
       td.WIN_LOSE,
       (SELECT count(*) FROM dbo.tblData td2 WHERE td2.EVENT_ID =td.EVENT_ID) AS [CountRunners],
       SUM(CASE WHEN td.EVENT_ID = td.EVENT_ID THEN 1  END) AS [Total Runners], 
       SUM(CASE WHEN td.WIN_LOSE = 1 THEN td.BSP  END) AS [WinnerPrice],
       SUM(CASE WHEN td.WIN_LOSE = 1 THEN 1 END) AS [WinnerCount],
       td.[Race No] AS RaceNo, 
       replace(LEFT(SUBSTRING(td.EVENT_NAME, CHARINDEX(' ', td.EVENT_NAME) + 1, LEN(td.EVENT_NAME)), CHARINDEX(' ', SUBSTRING(td.EVENT_NAME, CHARINDEX(' ', td.EVENT_NAME) + 2, LEN(td.EVENT_NAME)))),'m','') AS Distance, 
       REVERSE(LEFT(REVERSE(td.EVENT_NAME), CHARINDEX(' ', REVERSE(td.EVENT_NAME)) - 1)) AS Class, 
       FORMAT(CONVERT(DATETIME, td.EVENT_DT, 103), 'dddd') AS [Day],
       DATEPART(WEEKDAY, CONVERT(DATETIME, td.EVENT_DT, 103)) AS [DayNumber]
FROM tblData td
--WHERE td.EVENT_ID IN(144705336)
GROUP BY td.EVENT_ID, 
         td.MENU_HINT, 
         td.EVENT_NAME, 
         td.BSP,
         td.EVENT_DT, 
         td.[Race No],
         td.WIN_LOSE
         )



    SELECT 
    td.event_id,

    count(CASE WHEN td.BSP >1 AND td.BSP <=2 AND td.WIN_LOSE = 1 THEN td.BSP END) AS CountWinnerPrice1to2,
    sum(CASE WHEN td.BSP >1 AND td.BSP <=2 AND td.WIN_LOSE = 1 THEN td.BSP END) AS SumWinnerPrice1to2,
    count(CASE WHEN td.BSP >1 AND td.BSP <=2 AND td.WIN_LOSE = 1 AND td.CountRunners >0 AND td.CountRunners <=7 THEN td.BSP END) AS CountWinnerPrice1to2Runners0to7,
    sum(CASE WHEN td.BSP >1 AND td.BSP <=2 AND td.WIN_LOSE = 1 AND td.CountRunners >0 AND td.CountRunners <=7 THEN td.BSP END) AS SumWinnerPrice1to2Runners0to7,
    count(CASE WHEN td.BSP >1 AND td.BSP <=2 AND td.WIN_LOSE = 1 AND td.Distance >0 AND td.Distance <=1200 THEN td.BSP END) AS CountWinnerPrice1to2Distance0to1200,
    sum(CASE WHEN td.BSP >1 AND td.BSP <=2 AND td.WIN_LOSE = 1 AND td.Distance >0 AND td.Distance <=1200 THEN td.BSP END) AS SumWinnerPrice1to2Distance0to1200,
    sum(CASE WHEN td.BSP >2 AND td.BSP <=3 AND td.WIN_LOSE = 1 AND td.RaceNo >0 AND td.RaceNo <=4 THEN td.BSP END) AS SumWinnerPrice2to3raceno0to4,
    count(CASE WHEN td.BSP >2 AND td.BSP <=3 AND td.WIN_LOSE = 0 AND td.RaceNo >0 AND td.RaceNo <=4 THEN td.BSP END) AS CountWinnerNotPrice2to3raceno0to4,
    count(CASE WHEN td.BSP >1 AND td.BSP <=2 AND td.WIN_LOSE = 0 AND td.Class in ('CL1','CL2','CL3') THEN td.BSP END) AS CountWinnerNotPrice1to2DayCL1orCL2orCL3,
    sum(CASE WHEN td.BSP >1 AND td.BSP <=2 AND td.WIN_LOSE = 0 AND td.Class in ('CL1','CL2','CL3') THEN td.BSP END) AS SumWinnerNotPrice1to2DayCL1orCL2orCL3,
    count(CASE WHEN td.BSP >1 AND td.BSP <=2 AND td.WIN_LOSE = 0 AND td.DayNumber in (5,6) THEN td.BSP END) AS CountWinnerNotPrice1to2Day5or6,
    sum(CASE WHEN td.BSP >1 AND td.BSP <=2 AND td.WIN_LOSE = 0 AND td.DayNumber in (5,6) THEN td.BSP END) AS SumWinnerNotPrice1to2Day5or6,
    isnull((SELECT count(td2.BSP - CASE WHEN td2.WIN_LOSE =1 THEN 1 end)  FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >2 AND td2.BSP <3 HAVING count(td2.BSP) IN(0,1)   ),0) AS CountWinnerPrice2to3Runners0to1,
    (SELECT sum(td2.BSP - CASE WHEN td2.WIN_LOSE =0 THEN td2.BSP ELSE 0 end)  FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >2 AND td2.BSP <3 HAVING count(td2.BSP) IN(0,1)   ) AS SumWinnerPrice2to3Runners0to1,
    isnull((SELECT count(td2.BSP - CASE WHEN td2.WIN_LOSE =0 THEN 1 end)  FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >2 AND td2.BSP <3 HAVING count(td2.BSP) IN(0,1)   ),0) AS CountWinnerNotPrice2to3Runners0to1,
    (SELECT sum(td2.BSP - CASE WHEN td2.WIN_LOSE =1 THEN td2.BSP ELSE 0 end)  FROM dbo.tblData td2 WHERE td2.EVENT_ID = td.EVENT_ID AND td2.BSP >2 AND td2.BSP <3 HAVING count(td2.BSP) IN(0,1)   ) AS SumWinnerNotPrice2to3Runners0to1
FROM CTE_TblData td
WHERE td.class not in ('S', 'M', 'Trot', 'Pace')
GROUP BY td.event_id, td.MENU_HINT, td.EVENT_NAME, td.Expr1003, td.RaceNo, td.Distance, td.Class, td.[Day]
Order by td.Expr1003 desc, td.raceno desc, event_id desc

. Это просто для того, чтобы дать небольшую идею о том, с чем я имею дело, запрос возвращает 900 различных полей для комбинации мне нужны.

вот паста результата таблицы:

╔═══════════╦══════════════════════╦════════════════════╦═════════════════════════════════╦═══════════════════════════════╦═════════════════════════════════════╦═══════════════════════════════════╦══════════════════════════════╦═══════════════════════════════════╦═════════════════════════════════════════╦═══════════════════════════════════════╦════════════════════════════════╦══════════════════════════════╦═════════════════════════════════╦═══════════════════════════════╦════════════════════════════════════╦══════════════════════════════════╗
║  event_id ║ CountWinnerPrice1to2 ║ SumWinnerPrice1to2 ║ CountWinnerPrice1to2Runners0to7 ║ SumWinnerPrice1to2Runners0to7 ║ CountWinnerPrice1to2Distance0to1200 ║ SumWinnerPrice1to2Distance0to1200 ║ SumWinnerPrice2to3raceno0to4 ║ CountWinnerNotPrice2to3raceno0to4 ║ CountWinnerNotPrice1to2DayCL1orCL2orCL3 ║ SumWinnerNotPrice1to2DayCL1orCL2orCL3 ║ CountWinnerNotPrice1to2Day5or6 ║ SumWinnerNotPrice1to2Day5or6 ║ CountWinnerPrice2to3Runners0to1 ║ SumWinnerPrice2to3Runners0to1 ║ CountWinnerNotPrice2to3Runners0to1 ║ SumWinnerNotPrice2to3Runners0to1 ║
╠═══════════╬══════════════════════╬════════════════════╬═════════════════════════════════╬═══════════════════════════════╬═════════════════════════════════════╬═══════════════════════════════════╬══════════════════════════════╬═══════════════════════════════════╬═════════════════════════════════════════╬═══════════════════════════════════════╬════════════════════════════════╬══════════════════════════════╬═════════════════════════════════╬═══════════════════════════════╬════════════════════════════════════╬══════════════════════════════════╣
║ 146356540 ║ 1                    ║ 1.54               ║ 1                               ║ 1.54                          ║ 0                                   ║ NULL                              ║ NULL                         ║ 0                                 ║ 0                                       ║ NULL                                  ║ 0                              ║ NULL                         ║ 0                               ║ NULL                          ║ 0                                  ║ NULL                             ║
╠═══════════╬══════════════════════╬════════════════════╬═════════════════════════════════╬═══════════════════════════════╬═════════════════════════════════════╬═══════════════════════════════════╬══════════════════════════════╬═══════════════════════════════════╬═════════════════════════════════════════╬═══════════════════════════════════════╬════════════════════════════════╬══════════════════════════════╬═════════════════════════════════╬═══════════════════════════════╬════════════════════════════════════╬══════════════════════════════════╣
║ 146325088 ║ 0                    ║ NULL               ║ 0                               ║ NULL                          ║ 0                                   ║ NULL                              ║ NULL                         ║ 0                                 ║ 0                                       ║ NULL                                  ║ 0                              ║ NULL                         ║ 0                               ║ 0.00                          ║ 1                                  ║ 2.19                             ║
╠═══════════╬══════════════════════╬════════════════════╬═════════════════════════════════╬═══════════════════════════════╬═════════════════════════════════════╬═══════════════════════════════════╬══════════════════════════════╬═══════════════════════════════════╬═════════════════════════════════════════╬═══════════════════════════════════════╬════════════════════════════════╬══════════════════════════════╬═════════════════════════════════╬═══════════════════════════════╬════════════════════════════════════╬══════════════════════════════════╣
║ 146325086 ║ 0                    ║ NULL               ║ 0                               ║ NULL                          ║ 0                                   ║ NULL                              ║ NULL                         ║ 0                                 ║ 0                                       ║ NULL                                  ║ 0                              ║ NULL                         ║ 0                               ║ NULL                          ║ 0                                  ║ NULL                             ║

Теперь, если этого недостаточно, мне нужно вычислить прибыль и убытки для каждой скобки столбца. для этого я использую комбинацию CTE в CTE, чтобы упорядочить группы. Я прилагаю небольшой скриншот, который объясняет, что нужно сделать, а затем выполняю для этого вычисления:

enter image description here

и подмножество запроса что я запускаю его с полями из скриншота:

WITH base 
     AS (SELECT td.EVENT_ID AS event_id, 
                td.MENU_HINT AS race, 
                td.EVENT_NAME AS event, 
                td.expr1003 AS [date], 
                td.raceno AS [race number], 
                td.countwinnerprice5to8, -- AS [count1],
                td.sumwinnerprice5to8, -- AS [sum1],
                td.countwinnernotprice5to8, -- AS [count2],
                td.sumwinnernotprice5to8, -- AS [sum2],
                td.countwinnerprice8to13, -- AS [count1],
                td.sumwinnerprice8to13, -- AS [sum1],
                td.countwinnernotprice8to13, -- AS [count2],
                td.sumwinnernotprice8to13, -- AS [sum2],
                LEAD(td.sumwinnerprice5to8, 1) OVER(PARTITION BY countwinnerprice5to8
                ORDER BY expr1003 DESC, 
                         raceno DESC, 
                         event_id DESC) AS lead_sumwinnerprice5to8, 
                LEAD(td.sumwinnerprice8to13, 1) OVER(PARTITION BY countwinnerprice8to13
                ORDER BY expr1003 DESC, 
                         raceno DESC, 
                         event_id DESC) AS lead_sumwinnerprice8to13
         FROM tbldata5 td
         WHERE menu_hint LIKE '%Flem%'),
     base_grouped
       -- First, create a group identifier, but in the -opposite- direction
  -- (This will group the rows where you want to sum [count2])
     AS (SELECT base.event_id, 
                base.race, 
                base.event, 
                base.[date], 
                base.[race number], 
                base.countwinnerprice5to8, 
                base.sumwinnerprice5to8, 
                base.countwinnernotprice5to8, 
                base.sumwinnernotprice5to8, 
                base.countwinnerprice8to13, 
                base.sumwinnerprice8to13, 
                base.countwinnernotprice8to13, 
                base.sumwinnernotprice8to13, 
                base.lead_sumwinnerprice5to8, 
                base.lead_sumwinnerprice8to13, 
                SUM(countwinnerprice5to8) OVER(
                ORDER BY [date], 
                         [race number], 
                         event_id) AS group_id, 
                SUM(countwinnerprice8to13) OVER(
                ORDER BY [date], 
                         [race number], 
                         event_id) AS group_id2
         FROM base),
     base_grouped_summed
       -- Then do the sum on [count2] within those groups
     AS (SELECT base_grouped.event_id, 
                base_grouped.race, 
                base_grouped.event, 
                base_grouped.[date], 
                base_grouped.[race number], 
                base_grouped.countwinnerprice5to8, 
                base_grouped.sumwinnerprice5to8, 
                base_grouped.countwinnernotprice5to8, 
                base_grouped.sumwinnernotprice5to8, 
                base_grouped.countwinnerprice8to13, 
                base_grouped.sumwinnerprice8to13, 
                base_grouped.countwinnernotprice8to13, 
                base_grouped.sumwinnernotprice8to13, 
                base_grouped.lead_sumwinnerprice5to8, 
                base_grouped.lead_sumwinnerprice8to13, 
                base_grouped.group_id, 
                base_grouped.group_id2, 
                SUM(countwinnernotprice5to8) OVER(PARTITION BY group_id) AS sum_count2, 
                SUM(countwinnernotprice8to13) OVER(PARTITION BY group_id) AS sum_count3
         FROM base_grouped)
         -- Now deduct it from [lead2] (only does anything when [lead2] is not null)
     SELECT base_grouped_summed.event_id, 
            base_grouped_summed.race, 
            base_grouped_summed.event, 
            base_grouped_summed.[date], 
            base_grouped_summed.[race number], 
            base_grouped_summed.countwinnerprice5to8, 
            base_grouped_summed.sumwinnerprice5to8, 
            base_grouped_summed.countwinnernotprice5to8, 
            base_grouped_summed.sumwinnernotprice5to8,
            base_grouped_summed.group_id, 
            base_grouped_summed.sum_count2,
            (lead_sumwinnerprice5to8 - LAG(sum_count2) OVER(
             ORDER BY group_id)) - 1 AS [Profit_Loss], 
            base_grouped_summed.countwinnerprice8to13, 
            base_grouped_summed.sumwinnerprice8to13, 
            base_grouped_summed.countwinnernotprice8to13, 
            base_grouped_summed.sumwinnernotprice8to13, 
            base_grouped_summed.lead_sumwinnerprice5to8, 
            base_grouped_summed.lead_sumwinnerprice8to13, 
            base_grouped_summed.group_id2,  
            base_grouped_summed.sum_count3, 
            (lead_sumwinnerprice8to13 - LAG(sum_count3) OVER(
             ORDER BY group_id)) - 1 AS [Profit_Loss2]
     FROM base_grouped_summed
     ORDER BY [date] DESC, 
              [race number] DESC, 
              event_id DESC;

и срезом таблицы, которую он выводит:

╔═══════════╦═══════════════════════════╦═══════════════╦════════════╦═════════════╦══════════════════════╦════════════════════╦═════════════════════════╦═══════════════════════╦══════════╦════════════╦═════════════╦═══════════════════════╦═════════════════════╦══════════════════════════╦════════════════════════╦═════════════════════════╦══════════════════════════╦═══════════╦════════════╦══════════════╗
║  event_id ║ race                      ║ event         ║ date       ║ race number ║ countwinnerprice5to8 ║ sumwinnerprice5to8 ║ countwinnernotprice5to8 ║ sumwinnernotprice5to8 ║ group_id ║ sum_count2 ║ Profit_Loss ║ countwinnerprice8to13 ║ sumwinnerprice8to13 ║ countwinnernotprice8to13 ║ sumwinnernotprice8to13 ║ lead_sumwinnerprice5to8 ║ lead_sumwinnerprice8to13 ║ group_id2 ║ sum_count3 ║ Profit_Loss2 ║
╠═══════════╬═══════════════════════════╬═══════════════╬════════════╬═════════════╬══════════════════════╬════════════════════╬═════════════════════════╬═══════════════════════╬══════════╬════════════╬═════════════╬═══════════════════════╬═════════════════════╬══════════════════════════╬════════════════════════╬═════════════════════════╬══════════════════════════╬═══════════╬════════════╬══════════════╣
║ 145719665 ║ AUS / Flem (AUS) 21st Jul ║ R9 1000m Hcap ║ 2018-07-21 ║ 9           ║ 0                    ║ NULL               ║ 1                       ║ 7.40                  ║ 25       ║ 6          ║ NULL        ║ 0                     ║ NULL                ║ 1                        ║ 10.08                  ║ NULL                    ║ NULL                     ║ 24        ║ 13         ║ NULL         ║
╠═══════════╬═══════════════════════════╬═══════════════╬════════════╬═════════════╬══════════════════════╬════════════════════╬═════════════════════════╬═══════════════════════╬══════════╬════════════╬═════════════╬═══════════════════════╬═════════════════════╬══════════════════════════╬════════════════════════╬═════════════════════════╬══════════════════════════╬═══════════╬════════════╬══════════════╣
║ 145719663 ║ AUS / Flem (AUS) 21st Jul ║ R8 2000m Hcap ║ 2018-07-21 ║ 8           ║ 0                    ║ NULL               ║ 0                       ║ NULL                  ║ 25       ║ 6          ║ NULL        ║ 0                     ║ NULL                ║ 2                        ║ 20.94                  ║ NULL                    ║ NULL                     ║ 24        ║ 13         ║ NULL         ║
╠═══════════╬═══════════════════════════╬═══════════════╬════════════╬═════════════╬══════════════════════╬════════════════════╬═════════════════════════╬═══════════════════════╬══════════╬════════════╬═════════════╬═══════════════════════╬═════════════════════╬══════════════════════════╬════════════════════════╬═════════════════════════╬══════════════════════════╬═══════════╬════════════╬══════════════╣
║ 145719661 ║ AUS / Flem (AUS) 21st Jul ║ R7 1600m 3yo  ║ 2018-07-21 ║ 7           ║ 0                    ║ NULL               ║ 1                       ║ 6.22                  ║ 25       ║ 6          ║ NULL        ║ 1                     ║ 12.50               ║ 0                        ║ NULL                   ║ NULL                    ║ 11.83                    ║ 24        ║ 13         ║ -2.17        ║
╠═══════════╬═══════════════════════════╬═══════════════╬════════════╬═════════════╬══════════════════════╬════════════════════╬═════════════════════════╬═══════════════════════╬══════════╬════════════╬═════════════╬═══════════════════════╬═════════════════════╬══════════════════════════╬════════════════════════╬═════════════════════════╬══════════════════════════╬═══════════╬════════════╬══════════════╣
║ 145719659 ║ AUS / Flem (AUS) 21st Jul ║ R6 1100m 3yo  ║ 2018-07-21 ║ 6           ║ 0                    ║ NULL               ║ 1                       ║ 7.60                  ║ 25       ║ 6          ║ NULL        ║ 0                     ║ NULL                ║ 1                        ║ 12.95                  ║ NULL                    ║ NULL                     ║ 23        ║ 13         ║ NULL         ║
╠═══════════╬═══════════════════════════╬═══════════════╬════════════╬═════════════╬══════════════════════╬════════════════════╬═════════════════════════╬═══════════════════════╬══════════╬════════════╬═════════════╬═══════════════════════╬═════════════════════╬══════════════════════════╬════════════════════════╬═════════════════════════╬══════════════════════════╬═══════════╬════════════╬══════════════╣
║ 145719657 ║ AUS / Flem (AUS) 21st Jul ║ R5 1800m 2yo  ║ 2018-07-21 ║ 5           ║ 0                    ║ NULL               ║ 1                       ║ 7.69                  ║ 25       ║ 6          ║ NULL        ║ 0                     ║ NULL                ║ 0                        ║ NULL                   ║ NULL                    ║ NULL                     ║ 23        ║ 13         ║ NULL         ║
╠═══════════╬═══════════════════════════╬═══════════════╬════════════╬═════════════╬══════════════════════╬════════════════════╬═════════════════════════╬═══════════════════════╬══════════╬════════════╬═════════════╬═══════════════════════╬═════════════════════╬══════════════════════════╬════════════════════════╬═════════════════════════╬══════════════════════════╬═══════════╬════════════╬══════════════╣
║ 145719655 ║ AUS / Flem (AUS) 21st Jul ║ R4 1200m Hcap ║ 2018-07-21 ║ 4           ║ 0                    ║ NULL               ║ 1                       ║ 5.90                  ║ 25       ║ 6          ║ NULL        ║ 1                     ║ 11.83               ║ 2                        ║ 23.83                  ║ NULL                    ║ 9.96                     ║ 23        ║ 13         ║ -4.04        ║
╠═══════════╬═══════════════════════════╬═══════════════╬════════════╬═════════════╬══════════════════════╬════════════════════╬═════════════════════════╬═══════════════════════╬══════════╬════════════╬═════════════╬═══════════════════════╬═════════════════════╬══════════════════════════╬════════════════════════╬═════════════════════════╬══════════════════════════╬═══════════╬════════════╬══════════════╣
║ 145719653 ║ AUS / Flem (AUS) 21st Jul ║ R3 2500m Hcap ║ 2018-07-21 ║ 3           ║ 0                    ║ NULL               ║ 0                       ║ NULL                  ║ 25       ║ 6          ║ NULL        ║ 0                     ║ NULL                ║ 3                        ║ 35.02                  ║ NULL                    ║ NULL                     ║ 22        ║ 13         ║ NULL         ║
╚═══════════╩═══════════════════════════╩═══════════════╩════════════╩═════════════╩══════════════════════╩════════════════════╩═════════════════════════╩═══════════════════════╩══════════╩════════════╩═════════════╩═══════════════════════╩═════════════════════╩══════════════════════════╩════════════════════════╩═════════════════════════╩══════════════════════════╩═══════════╩════════════╩══════════════╝

Итак, что я пытаюсь сделать сейчас нужно найти способ сократить все эти вычисления сейчас.

Я знаю, что текущий метод ужасен и его можно улучшить. данные, которые обрабатываются, не меняются исторически, поэтому их можно сохранять в таблицах и использовать для уменьшения логики кодирования c. но я пытался как-то уменьшить общий код для части «прибыль / убыток», так как для этого потребуется много кода, чтобы сгенерировать каждый столбец и затем вызвать его в нужном месте. Можно ли как-то сократить последний запрос, например, с помощью функций?

Я могу предоставить DDL главной таблицы и некоторые данные, если это поможет.

...