Я использую дизайн представления SQL Server:
SELECT
RaceDateTime, Meeting, Horse, Jockey, Trainer, CardNumber,
Result, [WinSP ], Going, Furlongs, Prize,
FROM
dbo.[RACE-TEMPLATE]
WHERE
(1 = 1) AND
(BetfairSP_Rank = 1) AND
(YEAR(RaceDateTime) > 2016) AND
(Furlongs <= 8) AND
(Jockey = 'Smith')
Выше приведен пример программы, которая запускается как есть. Я также хочу добавить дополнительную выходную цифру.
SUM [WinSP ] of all cases where 'Result' = 1
Затем сообщите заголовок следующим образом.
COUNT (TOTAL RECORDS) COUNT (Results = 1) SUM ([WinSP ] of all cases where 'Result' = 1)
FYI (YEAR(RaceDateTime) > 2016) не подлежит SARG, поэтому его следует избегать в WHERE. Используйте диапазон дат: RaceDateTime >= '20160101' AND RaceDateTime < '20170101'


Вы можете предварительно вычислить суммы и подсчеты в общем табличном выражении , используя выражение CASE.
WITH Sums_CTE (CountRecords, Count1Results, Sum1ResultWinSPs)
AS
(
SELECT
COUNT(*) AS CountRecords,
SUM(CASE WHEN Result = 1 THEN 1 ELSE 0 END) AS Count1Results,
SUM(CASE WHEN Result = 1 THEN WinSP ELSE 0 END) AS Sum1ResultWinSPs
FROM Sales.SalesOrderHeader
WHERE SalesPersonID IS NOT NULL
)
SELECT
Sums_CTE.CountRecords, Sums_CTE.Count1Results, Sums_CTE.Sum1ResultWinSPs,
RaceDateTime, Meeting, Horse, Jockey, Trainer, CardNumber,
Result, [WinSP ], Going, Furlongs, Prize
FROM
Sums_CTE
CROSS JOIN dbo.[RACE-TEMPLATE]
WHERE
(1 = 1) AND
(BetfairSP_Rank = 1) AND
(YEAR(RaceDateTime) > 2016) AND
(Furlongs <= 8) AND
(Jockey = 'Smith')
Не уверен, с чего начать, но завтра подумаю.
Можно использовать оконные условные подсчеты и суммы. Windowing использует предложение OVER, в этом случае кажется, что вам просто нужно OVER ().
SELECT
RaceDateTime, Meeting, Horse, Jockey, Trainer, CardNumber,
Result, [WinSP ], Going, Furlongs, Prize,
TotalCount = COUNT(*) OVER (),
Results1Count = COUNT(CASE WHEN Results = 1 THEN 1 END) OVER (),
Results1WinSP = SUM(CASE WHEN Results = 1 THEN WinSP END) OVER ()
FROM
dbo.[RACE-TEMPLATE]
WHERE
(1 = 1) AND
(BetfairSP_Rank = 1) AND
(RaceDateTime >= '20160101' AND RaceDateTime < '20170101') AND
(Furlongs <= 8) AND
(Jockey = 'Smith')
;
Обратите также внимание на использование правильного диапазона дат вместо использования функции YEAR, так как это означает, что сервер может правильно использовать индексы.
Спасибо, Чарлифейс, это сработало.
Скорее поблагодарите, подумайте о том, чтобы проголосовать и/или принять (щелкнув галочку)
Я хотел бы сделать отчет, включающий следующее, можно ли это сделать здесь, или мне нужно задать дополнительный вопрос? Заголовки и расчеты отчета следующие: BET, P/L, ROI, WINS, S/R. СТАВКА=Общее количество рекордов, P/L=СУММА WinSP-Bet, ROI=P/L/BET, WINS=(СЛУЧАЙ, КОГДА Результаты = 1), S/R=WINS/BET (*100)
Я предлагаю вам создать новый вопрос для этого. Но вы должны быть в состоянии сделать это самостоятельно, учитывая то, что я вам показал.
Простите мое невежество, Чарлифейс, но я здесь новичок и почти не имею опыта кодирования. Я хотел бы попытаться сделать отчет, но лучше задать новый вопрос. Подходит ли формат моего вопроса или мне нужно изменить его?
Образцы данных и ожидаемые результаты помогут лучше понять требования. Еще лучше: сделайте полный сценарий CREATE TABLE и INSERT, чтобы мы могли его воспроизвести. dbfiddle.uk очень хорошо подходит для этого.
Предпочтительный формат BET P/L ROI WINS S/R 220 22 10,0% 110 50,0% здесь не работает, но данные должны быть под заголовками
Привет, Charlieface. Просто чтобы подтвердить, что я смог последовать твоему совету и создал эти дополнительные столбцы. Еще раз спасибо за вашу помощь. Ведь это было не так сложно. Ян
Кажется, вам нужно оконное условное выражение
COUNT? Примеры данных и ожидаемые результаты действительно помогут нам помочь вам здесь.