Змінюй хід війни! Допомагай ЗСУ!
  • Знижка на баннерну рекламу 30%! Банер на всіх сторінках сайту, в мобільній та десктопній версії за 14 тис. грн на місяць. Статистика сайту. Контакт: [email protected]

Помогите написать 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-й запрос написать

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

Научись сперва строить базы парвильно :)
 
ТС, нехорошо вываливать на форум задачу из тестового задания для приёма на работу.
 
Назад
Зверху Знизу