Как разрешить нулевое значение при создании представления - PullRequest
0 голосов
/ 26 ноября 2018

Мне нужно создать вид, подобный этому:

STUDENT JANUARY FEBRUARY MARCH ........ DECEMBER
miki     10.23   23.23    0               0
Goku     10        0       0               0
 Luffy    0       0        0               0

У меня есть таблица studentMovement(id_studentmovement,id_student,month,year,cost,date,id_university,university_name)

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

Table Students(id_student,name)

Table University(id_university,university name);

Я хочу получить стоимость для каждого университета, для всех студентов и для одного студента за каждый месяц (также, еслистудент не потратил ничего в определенном университете:

Этот sql-запрос выглядит так:

select year(sm.date) as year, s.id_student, s.name,
       sum(amount) as year_amount,
       sum(case when month(sm.date) = 1 then amount else 0 end) as january,
       sum(case when month(sm.date) = 2 then amount else 0 end) as february,
       . . .
       sum(case when month(sm.date) = 12 then amount else 0 end) as december,


       u.id_university as id_university,
       u.university_name as university_name
from ((schema.students s left join
     schema.studentMovement sm 
     on s.d_student = sm.id_student ) inner join schema.university u on u.id_university=sm.id_university) 

group by year(sm.date) as year, s.id_student, s.name,  u.id_university,
       u.university_name

В запросе указано неверное значение, а какое-то значение равно нулю. Кто-нибудь может мне помочь?

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018

Возможно, вы заметили некоторые неправильные значения в поле суммы: попробуйте удалить двойные кавычки

COALESCE(SUM(sm.amount), 0) AS amount,
0 голосов
/ 26 ноября 2018

Null значения появляются из вашего заявления Left Join.Потому что он возвращает все записи из left table и сопоставленные записи из right table.Результат - NULL с правой стороны, если совпадений нет.

select 
   year(sm.date) as year, 
   s.id_student, 
   s.name,
   sum(amount) as year_amount,
   sum(case when month(sm.date) = 1 then amount else 0 end) as january,
   sum(case when month(sm.date) = 2 then amount else 0 end) as february,
   . . .
   sum(case when month(sm.date) = 12 then amount else 0 end) as december,
   u.id_university as id_university,
   u.university_name as university_name
from 
  ((schema.students s 
    inner join schema.studentMovement sm on s.d_student = sm.id_student ) 
         inner join schema.university u on u.id_university=sm.id_university) 
group by 
   year(sm.date), 
   s.id_student, 
   s.name,  
   u.id_university,
   u.university_name

Если вы не хотите видеть Null, измените Left Join на Inner Join вместо этого, потому что Inner Join выбираетзаписи, которые имеют совпадающие значения в обеих таблицах.

0 голосов
/ 26 ноября 2018

Попробуйте просто использовать внутренние объединения в предложении from:

FROM schema.students s JOIN
     schema.studentMovement sm 
     ON s.d_student = sm.id_student JOIN
     schema.university u
     ON u.id_university = sm.id_university
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...