количество флагов в столбце после поворота таблицы - PullRequest
0 голосов
/ 21 марта 2019

Я создал функцию, которая поворачивает мою текущую таблицу, чтобы я мог видеть, кому из моих учеников нравится какой вид спорта.Я использую oracle db.Так что теперь каждый вид спорта находится в отдельной колонке после разворота.Он помечается как 1, если студент занимается этим конкретным видом спорта.

    Year    Student    Basketball    Baseball    Golf    Soccer   
    2019    Michael         1           NA         1        NA
    2018    Jason           NA          NA         1        NA
    2017    Sarah           1           1          1        NA
    2016    Michelle        NA          NA         NA       NA

Я хочу подсчитать количество столбцов, чтобы узнать, сколько учеников отметили соответствующий вид спорта.

select 
   SUM(CASE WHEN Basketball=1 THEN 1 ELSE 0 END) as NBA,
   SUM(CASE WHEN Baseball=1 THEN 1 ELSE 0 END) as MLB,
   SUM(CASE WHEN Golf=1 THEN 1 ELSE 0 END) as PGA,
   SUM(CASE WHEN Soccer=1 THEN 1 ELSE 0 END) as MLS
from students_sports
group by year
order by 1;

Я пробовал синтаксис выше, но не повезло.Я также попробовал следующий синтаксис:

select 
    sum(nvl("Basketball", 0)) as NBA,
    sum(nvl("Baseball", 0)) as MLB,
    etc....

Когда я запускаю этот запрос, я получаю общее количество строк, а не фактическое количество строк, помеченных как 1. Есть мысли?

1 Ответ

2 голосов
/ 21 марта 2019

первый синтаксис неверен. Ваш столбец Basketball, Baseball, Golf, Soccer - это varchar, поскольку вы сохраняете NA в поле, а не в числовом. И пока вы делаете сравнение в запросе CASE WHEN Basketball=1, вы делаете числовое сравнение. Поэтому измените ваш запрос следующим образом и дайте нам знать, если он работает.

**Query**  
`SELECT SUM (CASE WHEN Basketball = '1' THEN 1 ELSE 0 END) AS NBA
      ,SUM (CASE WHEN Baseball = '1' THEN 1 ELSE 0 END)   AS MLB
      ,SUM (CASE WHEN Golf = '1' THEN 1 ELSE 0 END)       AS PGA
      ,SUM (CASE WHEN Soccer = '1' THEN 1 ELSE 0 END)     AS MLS
FROM students_sports
GROUP BY year
ORDER BY 1;`

Пример:
https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=9c6cc6b067cc128b699316cb299769e3

This should give you result as 1 or 0. Let us know how it goes. I am not sure about your SUM what are you doing with it but it does not make sense to me as that sum will worth nothing.
...