У меня есть запрос для анализа данных в таблице, таблица имеет огромное количество полей, и мне нужно попытаться найти способ упростить ее работу.
У меня есть этот базовый 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, чтобы упорядочить группы. Я прилагаю небольшой скриншот, который объясняет, что нужно сделать, а затем выполняю для этого вычисления:
и подмножество запроса что я запускаю его с полями из скриншота:
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 главной таблицы и некоторые данные, если это поможет.