SQL - Как выполнить расчет на основе значений - PullRequest
3 голосов
/ 08 ноября 2019

Я прошу прощения за плохое название. Я не уверен, как это будет называться.

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

 Year     Item     Count
 2018     A        5
 2018     A        12
 2018     A        7
 2018     B        3
 2018     B        1
 2018     B        8
 2018     C        50
 2018     C        38
 2018     C        42
 2019     A        8
 2019     A        14
 2019     A        9
 2019     B        5
 2019     B        4
 2019     B        12
 2019     C        62
 2019     C        45
 2019     C        48

То, что я пытаюсь сделать, это получить сумму отсчета для каждого элемента по году, затем выполнить (A + B) / С за каждый год. У меня есть ощущение, что это должно быть просто, но я просто не могу обернуть голову вокруг него.

Таким образом, результат будет

 2018 .2769
 2019 .3161      

Я получил их вручную, выполнив шаг за шагомпошаговые расчеты для (A + B) / C:

 2018 ((5 + 12 + 7) + (3 + 1 + 8)) / (50 + 38 + 42)
 2018 ((24) + (12)) / 130
 2018 36 / 130
 2018 .2769

 2019 ((8 + 14 + 9) + (5 + 4 + 12)) / (62 + 45 + 48)
 2019 ((31) + (21)) / (155)
 2019 52 / 155
 2019 .3355

Любая помощь будет оценена!

1 Ответ

2 голосов
/ 08 ноября 2019

С условным агрегированием:

select
  [Year],
  round(
    1.0 * 
    sum(case when [Item] in ('A', 'B') then [Count] else 0 end)/
    sum(case when [Item] = 'C' then [Count] else 0 end)
    , 4
  ) result
from tablename
group by [Year]

Вы можете изменить:

sum(case when [Item] = 'C' then [Count] else 0 end)

на:

sum(case when [Item] = 'C' then [Count] end)

, чтобы избежать деления на 0, если естьВ случае нет строк с [Item] = 'C' в течение года. Смотрите демо . Результаты:

> Year | result        
> ---: | :-----
> 2018 | 0.2769
> 2019 | 0.3355
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...