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

Откуда:
Сообщений: 4
Есть таблица Нагрузка (Код_преподавателя, Код_дисциплины, стоимость_часа, почасовая_оплата)
Код_преподавателя и Код_дисциплины - первичный ключ
Почасовая_оплата=True или False (bit)
Нужно вывести количество дисциплин, которое ведет каждый штатный преподаватель, у которого средняя стоимость часа за все дисциплины больше чем средняя стоимость часа у каждого совместителя, который ведет хотя бы одну дисциплину, которую ведет этот штатник.

Штатный преподаватель - это преподаватель, у которого хотя бы в одной дисциплине поле Почасовая_оплата=False, если же все поля=true, то это совместитель

Можете помочь это сделать?

Код для создания таблицы
CREATE TABLE [dbo].[Нагрузка](
    [Код_преподавателя] [INT] NOT NULL,
    [Код_дисциплины] [INT] NOT NULL,
    [Стоимость_часа] [DECIMAL](18, 2) NULL,
    [Почасовая_оплата] [bit] NULL,
 CONSTRAINT [PK_Нагрузка] PRIMARY KEY CLUSTERED 
(
    [Код_преподавателя] ASC,
    [Код_дисциплины] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


Попытался решить задачу так, но этот запрос считает неправильно
Select Штатные_преподаватели.Код_преподавателя, count(Штатные_преподаватели.Код_дисциплины) as Количество_дисциплин
from Нагрузка Штатные_преподаватели inner join
(Select Код_преподавателя, Код_дисциплины, Стоимость_часа 
from Нагрузка where Код_преподавателя NOT IN (Select Код_преподавателя from Нагрузка Where Почасовая_оплата=0)) 
Совместители on Штатные_преподаватели.Код_дисциплины=Совместители.Код_дисциплины
inner join (Select Код_преподавателя, AVG(Стоимость_часа) as Средняя_зарплата
from Нагрузка
Where Код_преподавателя NOT IN (Select Код_преподавателя from Нагрузка Where Почасовая_оплата=0)
group by Код_преподавателя) Зарплаты_Совместителей On Совместители.Код_преподавателя=Зарплаты_Совместителей.Код_преподавателя
inner join (Select Код_преподавателя, AVG(Стоимость_часа) as Средняя_зарплата
from Нагрузка
Where Код_преподавателя  IN (Select Код_преподавателя from Нагрузка Where Почасовая_оплата=0)
group by Код_преподавателя) Зарплаты_штатников On Штатные_преподаватели.Код_преподавателя=Зарплаты_штатников.Код_преподавателя

where Штатные_преподаватели.Код_преподавателя  IN (Select Код_преподавателя from Нагрузка Where Почасовая_оплата=0) and Зарплаты_штатников.Средняя_зарплата>Зарплаты_Совместителей.Средняя_зарплата
Group by Штатные_преподаватели.Код_преподавателя
23 фев 19, 18:24    [21817931]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать количество дисциплин  [new]
aleks222
Member

Откуда:
Сообщений: 855
with t as ( select * from [dbo].[Нагрузка] )
   , [штат] as ( select * from t where [Почасовая_оплата] = 0 )
   , [совм] as ( select * from t where [Почасовая_оплата] = 1 )
   , [штат.ср.стоим] as ( select [Код_преподавателя], [Стоимость_часа] = avg([Стоимость_часа]), [Кол-во] = count(*) from  [штат] group by [Код_преподавателя] )
   , [совм.ср.стоим] as ( select [Код_преподавателя], [Стоимость_часа] = avg([Стоимость_часа]), [Кол-во] = count(*) from  [совм] group by [Код_преподавателя] )
  select * from [штат.ср.стоим] as a
    where not exists( select * 
	                    from [штат] as t 
						     inner join [совм] as x on t.[Код_дисциплины] = x.[Код_дисциплины] 
							 inner join [совм.ср.стоим] as y on y.[Код_преподавателя] = x.[Код_преподавателя] 
				        where t.[Код_преподавателя] = a.[Код_преподавателя] and y.[Стоимость_часа] >= a.[Стоимость_часа]
					)
24 фев 19, 10:34    [21818091]     Ответить | Цитировать Сообщить модератору
 Re: Посчитать количество дисциплин  [new]
ren4in
Member

Откуда:
Сообщений: 4
Cпасибо
24 фев 19, 12:23    [21818124]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить