Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подзапрос  [new]
shoni
Member

Откуда:
Сообщений: 3
Доброго времени суток!
Только-только начинаю осваивать SQL, не всё получается, помогите, пожалуйста, подзапрос написать...

Требуется вывести номер зачетной книжки (nzk) студентов, у которых от 1 до 5 тройки, а также определить средний балл, если тройки будут исправлены на 5-ки.


Select nzk as NomerKnizhki, COUNT (ocenka), 
 (
2*COUNT (ocenka) +   /* пересчёт ср. балла */
(Select SUM(Ocenka) from Zk Where Zk.Nzk= NomerKnizhki ) /* Собственно, тут проблема :( */
) /
(Select Count(*) from Zk Where Zk.Nzk= NomerKnizhki ) /* Аналогичная проблема :( */

From Zk  
Where ocenka=3 
Group by nzk
Having COUNT(Ocenka) between 1 and 5
2 сен 13, 01:30    [14782210]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос  [new]
так как-то
Guest
shoni
определить средний балл, если тройки будут исправлены на 5-ки.

Select nzk as NomerKnizhki, COUNT (ocenka), 
   avg(case when ocenka=3 then 5 else ocenka end) as [средний балл, если тройки будут исправлены на 5-ки]
...
2 сен 13, 02:12    [14782258]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос  [new]
так,
Guest
так как-то
shoni
определить средний балл, если тройки будут исправлены на 5-ки.

Select nzk as NomerKnizhki, COUNT (ocenka), 
   avg(case when ocenka=3 then 5 else ocenka end) as [средний балл, если тройки будут исправлены на 5-ки]
...

вообще там всё неправильно

полностью так
Select nzk as NomerKnizhki, COUNT (ocenka), 
   avg(case when ocenka=3 then 5 else ocenka end) as [средний балл, если тройки будут исправлены на 5-ки]
From Zk  
Group by nzk
Having sum(case when ocenka=3 then 1 end) between 1 and 5
2 сен 13, 02:16    [14782261]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос  [new]
Гость333
Member

Откуда:
Сообщений: 3683
так,
   avg(case when ocenka=3 then 5 else ocenka end) as [средний балл, если тройки будут исправлены на 5-ки]

Если тип столбца ocenka — целочисленный, то и возращаемое значение также будет целочисленным, причём даже не округлённым, а усечённым.

Поэтому, наверное, ещё правильнее будет примерно так:
   cast((avg(case when ocenka=3 then 5 else cast(ocenka as numeric(10, 2)) end)) as numeric(10,1) /* 1 - до скольки знаков хотим округлить*/) as [средний балл, если тройки будут исправлены на 5-ки]
2 сен 13, 09:10    [14782548]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
shoni,

Поставьте у всех таблиц алиасы.
И все поля пишите с алиасами таблиц.

К примеру, Zk.Nzk= NomerKnizhki можно представить так: Zk.Nzk= Zk.NomerKnizhki
Причём, Zk - это имя таблицы внутри подзапроса.
Это так и надо, да?
2 сен 13, 09:31    [14782590]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос  [new]
shoni
Member

Откуда:
Сообщений: 3
Спасибо всем большое, разобралась!
В итоге получилось

Select nzk as [Номер зачетки], COUNT (ocenka) as [Число 3], 
avg(cast (case when ocenka=3 then 5 else cast(ocenka as decimal) end as decimal)) as [Средний балл]
From Zk  
Group by nzk
Having sum(case when ocenka=3 then 1 end) between 1 and 5


или

Select nzk as [Номер зачетки], COUNT (ocenka) as [Число 3], 
avg(cast (case when ocenka=3 then 5 else cast(ocenka as numeric(4,1)) end as numeric (10,1) )) as    [Средний балл]
From Zk
Where Nzk in 
	(Select Nzk from zk where Ocenka=3
	 group by Nzk
	 having COUNT(ocenka) between 1 and 5)
Group by nzk
2 сен 13, 13:24    [14783902]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос  [new]
shoni
Member

Откуда:
Сообщений: 3
Гость333,

замечание справедливое, но независимо от того, пишу cast(ocenka as numeric(3,2)) или просто cast(ocenka as decimal) - результат упорно отображается с 6-ью знаками после запятой :)

К сообщению приложен файл. Размер - 53Kb
2 сен 13, 13:35    [14784024]     Ответить | Цитировать Сообщить модератору
 Re: Подзапрос  [new]
Гость333
Member

Откуда:
Сообщений: 3683
shoni
Гость333,

замечание справедливое, но независимо от того, пишу cast(ocenka as numeric(3,2)) или просто cast(ocenka as decimal)

А вы попробуйте, как у меня написано:
cast(avg( ... ) as numeric(10,1))
2 сен 13, 13:49    [14784132]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить