Вычислить столбец на основе количества других столбцов в случае выбора с делом - PullRequest
2 голосов
/ 15 марта 2020

У меня есть следующий набор данных:

EVENT_ID    MENU_HINT                   EVENT_NAME      SELECTION_ID EVENT_DT   WIN_LOSE    BSP
144705336   AUS / KemG (AUS) 16th Jun   R3 1000m 2yo    19276642    16-Jun-18   0           46.91005891
144705336   AUS / KemG (AUS) 16th Jun   R3 1000m 2yo    19052159    16-Jun-18   0           9.2
144705336   AUS / KemG (AUS) 16th Jun   R3 1000m 2yo    19276641    16-Jun-18   0           11
144705336   AUS / KemG (AUS) 16th Jun   R3 1000m 2yo    19276644    16-Jun-18   0           7.698731493
144705336   AUS / KemG (AUS) 16th Jun   R3 1000m 2yo    19276646    16-Jun-18   0           421.7295978
144705336   AUS / KemG (AUS) 16th Jun   R3 1000m 2yo    19276645    16-Jun-18   0           89.22199353
144705336   AUS / KemG (AUS) 16th Jun   R3 1000m 2yo    19276647    16-Jun-18   0           150
144705336   AUS / KemG (AUS) 16th Jun   R3 1000m 2yo    19276643    16-Jun-18   0           48.90986662
144705336   AUS / KemG (AUS) 16th Jun   R3 1000m 2yo    19276650    16-Jun-18   1           3.466233972
144705336   AUS / KemG (AUS) 16th Jun   R3 1000m 2yo    19276640    16-Jun-18   0           2.88

Для этого мне нужно вычислить несколько дополнительных столбцов, например:

CountWinnerNotPrice89to1000Runners7to12

и

SumWinnerNotPrice89to1000Runners7to12

Лог c для CountWinnerNotPrice89to1000Runners7to12: счет event_id со следующими условиями:

  • BSP должен быть между 89 и 1000 (3 строки покрывают это)
  • "win_lose" должно быть 0 (так как это "без цены")
  • общее количество event_id должно быть от 7 до 12 (количество участников)

Таким образом, результат этого столбца должен быть равен 3, и для SumWinnerNotPrice89to1000Runners7to12 применяются те же условия, но я должен вернуть СУММУ столбцов BSP, так что результат равен 660,95

Это один пример с эти данные, у меня есть несколько столбцов, еще один пример, если у меня есть

CountWinnerNotPrice7to15Runners7to12
SumWinnerNotPrice7to15Runners7to12

, то результаты, так как BSP будет между 7 и 15, будут

CountWinnerNotPrice7to15Runners7to12 = 3

SumWinnerNotPrice7to15Runners7to12 = 27.89

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

Я пробовал с CASE в избранном, но я не могу заставить его работать, когда мне нужно учитывать количество бегунов. Я также пытался использовать скалярные функции (для возврата данных требуются целые годы)

Я думаю, что logi c должен выполняться без необходимости рекурсивного поиска (я думаю, что нет CTE), поскольку у меня около 900 столбцов для добавить, и это, безусловно, убьет его.

Как может быть лог c для этого с делом? Я думаю, что что-то упустил, так как я пытался подобным образом:

SELECT COUNT(td.EVENT_NAME), 
       td.SELECTION_NAME, 
       SUM(CASE
               WHEN(td.BSP >= 89
                    AND td.BSP < 1000)
                   AND td.WIN_LOSE = 0
           AND COUNT(td.EVENT_NAME) > 7 --this doesn't work
           AND COUNT(td.EVENT_NAME) <= 12 --this doesn't work
               THEN td.BSP
           END) AS SumWinnerRunners
FROM tblData td
WHERE td.EVENT_ID = 144705336
GROUP BY td.SELECTION_NAME, 
         td.BSP;

Я думаю, что я не так далеко, но я не могу довести это до финиша sh здесь.

1 Ответ

1 голос
/ 15 марта 2020

Вы можете использовать apply

select 
  tblcnt.cnt
  ,td.selection_name
  ,case 
     when cnt between 7 and 12
     then SumWinnerNotPrice89to1000Runners7to12
     else 0
   end as SumWinnerNotPrice89to1000Runners7to12
  ,case 
     when cnt between 7 and 12
     then CountWinnerNotPrice89to1000Runners7to12
     else 0
   end as CountWinnerNotPrice89to1000Runners7to12
from tblData td
outer apply (
  select 
    count(*)
    ,sum(
      case 
        when tdi.BSP >= 89 
        and  tdi.BSP < 1000
        and  tdi.WIN_LOSE = 0
      then tdi.BSP
      else 0
    )
    ,sum(
      case 
        when tdi.BSP >= 89 
        and  tdi.BSP < 1000
        and  tdi.WIN_LOSE = 0
      then 1
      else 0
    )
  from tblData tdi
  where tdi.event_id = td.event_id
) tblcnt(cnt,SumWinnerNotPrice89to1000Runners7to12,CountWinnerNotPrice89to1000Runners7to12)

Вы можете добавить во внешнее приложение столько раз, сколько хотите.

...