4000 грн на місяць

Помогите написать SQL запрос

  • Автор теми Автор теми hatter
  • Дата створення Дата створення
Та не парься ты за этого мудака, сам учился в ХНУРЭ, знаю доуя программеров, есть пидорги-задроты, типа тех шо тебе отвечали, ну большая часть)))) А есть норм пацики, которые помогают и им пох че ты там знаешь, а че нет))))) Так что посылай всех задротов смело на йух!)))) Просто они все думают что круче них тока я йца, а попроси сигаретку вечерком когда стемнеет штаны пообсыкают)))))

Возьми и объясни. Или ты только по стрельбе сигареток спец?
 
Почему нельзя так:
select st.name as studentName,
CASE AverageMark
WHEN mark is NULL THEN avg(res.mark)
ELSE 0
End
FROM students
where st.ID=res.ID
group by st.name

Где ошибки, нельзя в Case подставить AverageMark,
 
Почему нельзя так:
select st.name as studentName,
CASE AverageMark
WHEN mark is NULL THEN avg(res.mark)
ELSE 0
End
FROM students
where st.ID=res.ID
group by st.name

как минимум на первый взгляд что такое res? ты не берешь из нее данные (поле FROM) и сравниваешь в WHERE. укажи ее в FROM
второе - что такое таблица st? откуда ты его взяло?

кстати концептуально можно еще мильен вариантов запросов написать если делать вариацию на тему имен таблиц и полей то есть AS StudentName, AS NameOfStudent И тд
 
То я чё-то не дописала, st , rs названия соответствующих таблиц, щас поправлю
select st.name as studentName,
CASE AverageMark
WHEN mark is NOT NULL THEN avg(res.mark)
ELSE 0
End
FROM students st,results res
where st.ID=res.ID
group by st.name
 
Останнє редагування:
Код:
select st.id as studentID
     , st.name as studentName
     , case
         when res.averageMark is null
           then 0
           else res.averageMark
         end as averageMark
  from students st
       left join
       (select studentsid
             , avg(mark) as averageMark                   
          from results
         group by studentsid) res
    on st.id = res.studentsid

По сути запрос правильный, но за такое нужно бить по рукам.
 
Код:
select st.id as studentID
     , st.name as studentName
     , case
         when res.averageMark is null
           then 0
           else res.averageMark
         end as averageMark
  from students st
       left join
       (select studentsid
             , avg(mark) as averageMark                   
          from results
         group by studentsid) res
    on st.id = res.studentsid

По сути запрос правильный, но за такое нужно бить по рукам.

А че так сложна?
вариант N3:

SELECT students.id, students.name,coalesce(avg(results.mark), 0) as averageMark
FROM students LEFT OUTER JOIN results
ON students.id = results.id
group by students.id, students.name


или не катит? где то ошибаюсь?
 
Есть такое понятие как план выполнения запроса. Вот, собственно, эффективность запроса оценивается по плану.

пофиг, при таком кол-ве записей можна пренебречь.
ну а если записей многа добавим индекс )

hatter, к утру sql будешь лучше препода знать, научим плохому :)
 
А че так сложна?
вариант N3:

SELECT students.id, students.name,coalesce(avg(results.mark), 0) as averageMark
FROM students LEFT OUTER JOIN results
ON students.id = results.id
group by students.id, students.name


или не катит? где то ошибаюсь?

screenshot2010100701.png


screenshot2010100703.png


пофиг, при таком кол-ве записей можна пренебречь.
ну а если записей многа добавим индекс )

hatter, к утру sql будешь лучше препода знать, научим плохому :)

Индекс далеко не панацея.

Разница между моими вариантами очевидна.

Можно еще капитально забыдлкодить:
Код:
select st.id as studentID
     , st.name as studentName
     , coalesce(avg(res.mark), 0) as averageMark
  from students st
     , results res
 where st.id = res.studentsID
 group by st.id
        , st.name
union
select st.id as studentID
     , st.name as studentName
     , 0 as averageMark
  from students st
 where st.id not in (select studentsid
                       from results)

Хотя не, можно еще толковее: :D

Код:
select st.id as studentID
     , st.name as studentName
     , [COLOR="Green"][b]sum(res.mark) / count(res.mark) as averageMark[/b][/COLOR]
  from students st
     , results res
 where st.id = res.studentsID
 group by st.id
        , st.name
union
select st.id as studentID
     , st.name as studentName
     , 0 as averageMark
  from students st
 where st.id not in (select studentsid
                       from results)


Я суть запроса меняю при одинаковом результате, а не подмениваю coalesce nvl'ом или case'ом.
 
С какой целью заведена тема?
ну так, приятно скоротать время с людьми умеющими поразмыслить.
Всё -таки хочу научиться писать запросы на СЯЗ, мне так нужно.
Я щас попробую 2-й запрос написать

значит надо получить список студентов с максимальным средним баллом из тех же таблиц:
Select st.name as StudentName, max(averageMark)
From st,res
Where
(select avg(res.mark) as averegeMark
FROM students st, results res
WHERE st.Id=res.Id)
 
Если учиться, то
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
. Например,
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
, конкретно твоего случая
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
.

Select st.name as StudentName, max(averageMark)
From st,res
Where
(select avg(res.mark) as averegeMark
FROM students st, results res
WHERE st.Id=res.Id)

facepalm
 
ну так, приятно скоротать время с людьми умеющими поразмыслить.
Всё -таки хочу научиться писать запросы на СЯЗ, мне так нужно.
Я щас попробую 2-й запрос написать

И че сдесь приятного, в такой задаче любой запрос покатит :)
А если копатся в Ваших курсовых, то у студента есть много предметов и оценок и у каждого предмета есть студенты :), т.е. изначаль третей формой не пахнет поэтому пох какие запросы ескюэля. так как будет избыточность предметов.

Научись сперва строить базы парвильно :)
 
Назад
Зверху Знизу