Как добавить предложение SUM для определенной переменной в оператор WHERE в SQL Server

Я использую дизайн представления 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)

Кажется, вам нужно оконное условное выражение COUNT? Примеры данных и ожидаемые результаты действительно помогут нам помочь вам здесь.

Thom A 01.08.2023 15:56

FYI (YEAR(RaceDateTime) > 2016) не подлежит SARG, поэтому его следует избегать в WHERE. Используйте диапазон дат: RaceDateTime >= '20160101' AND RaceDateTime < '20170101'

Thom A 01.08.2023 15:56
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете предварительно вычислить суммы и подсчеты в общем табличном выражении , используя выражение 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')

Не уверен, с чего начать, но завтра подумаю.

racepro 01.08.2023 20:56
Ответ принят как подходящий

Можно использовать оконные условные подсчеты и суммы. 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, так как это означает, что сервер может правильно использовать индексы.

Спасибо, Чарлифейс, это сработало.

racepro 01.08.2023 22:16

Скорее поблагодарите, подумайте о том, чтобы проголосовать и/или принять (щелкнув галочку)

Charlieface 01.08.2023 22:30

Я хотел бы сделать отчет, включающий следующее, можно ли это сделать здесь, или мне нужно задать дополнительный вопрос? Заголовки и расчеты отчета следующие: BET, P/L, ROI, WINS, S/R. СТАВКА=Общее количество рекордов, P/L=СУММА WinSP-Bet, ROI=P/L/BET, WINS=(СЛУЧАЙ, КОГДА Результаты = 1), S/R=WINS/BET (*100)

racepro 01.08.2023 22:49

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

Charlieface 01.08.2023 22:59

Простите мое невежество, Чарлифейс, но я здесь новичок и почти не имею опыта кодирования. Я хотел бы попытаться сделать отчет, но лучше задать новый вопрос. Подходит ли формат моего вопроса или мне нужно изменить его?

racepro 01.08.2023 23:17

Образцы данных и ожидаемые результаты помогут лучше понять требования. Еще лучше: сделайте полный сценарий CREATE TABLE и INSERT, чтобы мы могли его воспроизвести. dbfiddle.uk очень хорошо подходит для этого.

Charlieface 01.08.2023 23:29

Предпочтительный формат BET P/L ROI WINS S/R 220 22 10,0% 110 50,0% здесь не работает, но данные должны быть под заголовками

racepro 01.08.2023 23:53

Привет, Charlieface. Просто чтобы подтвердить, что я смог последовать твоему совету и создал эти дополнительные столбцы. Еще раз спасибо за вашу помощь. Ведь это было не так сложно. Ян

racepro 02.08.2023 10:14

Другие вопросы по теме