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

Откуда:
Сообщений: 5
Добрый вечер, написал процедуру, но работает она немного не так, как требуется.
Раз в месяц в таблицу "динамика показателей" записываются значения некоторых показателей для каждого предприятия.
Процедура должна для каждого предприятия сложить значения всех его показателей и найти среднее значение от этой суммы. Если среднее значение >= 100, то можно считать работу предприятия за месяц эффективной, в противном случае - нет. Результат своих умозаключений процедура записывает в таблицу отчета.
Моя процедурка записывает в отчет только 1 предприятие, а должна отчитаться по каждому предприятию.
Вот что я написал:
/*Определение эффективности работы предприятия за месяц*/
CREATE PROCEDURE Enterprise_performance
 AS 
 DECLARE
    @averagevalue as float,
	@ddate as datetime,
	@enterprisecode as int,	
	@enterprisename as varchar(20), 
    @efficiency as varchar(20)
/*Получаем код предприятия, название предприятия и дату*/
SELECT @enterprisecode = Dynamics_of_indicators.Enterprise_code, @ddate = Date, @enterprisename = Enterprises.Name 
FROM Dynamics_of_indicators join Enterprises
on Dynamics_of_indicators.Enterprise_code = Enterprises.Enterprise_code
/*Получаем среднее значение от значений показателей предприятия за месяц*/
SELECT @averagevalue = AVG(Value) 
from Dynamics_of_indicators 
where @enterprisecode = Enterprise_code and MONTH(@ddate) = MONTH(Date) and YEAR(@ddate)= YEAR(Date)
GROUP BY Enterprise_code
/*Если среднее значение >= 100, то работа предприятия за месяц была эффективной*/
if (@averagevalue >= 100)
BEGIN
SET @efficiency = 'Работа эффективна'
END
/*Если среднее значение < 100, то работа предприятия за месяц была неэффективной*/
else
BEGIN
SET @efficiency = 'Работа неэффективна'
END
/*Заполняем таблицу отчета эффективности работы предприятий.*/
insert into Report_enterprises_performance(Date, Enterprise_code, Enterprise_name, Efficiency)
values (@ddate,@enterprisecode,@enterprisename,@efficiency)


К сообщению приложен файл. Размер - 10Kb
24 апр 16, 21:31    [19100311]     Ответить | Цитировать Сообщить модератору
 Re: Изменение процедуры  [new]
iljy
Member

Откуда:
Сообщений: 8711
Henry Johnson,

учитесь мыслить множествами

SELECT e.Enterprise_code, MIN(Date), e.Name, case when AVG(i.Value) < 100 then 'Fail' else 'Vow!' end
FROM Dynamics_of_indicators i join Enterprises e on i.Enterprise_code = e.Enterprise_code
where '20160401' <= i.Date and i.Date < '20160501'
group by e.Enterprise_code, e.Name 
24 апр 16, 21:55    [19100438]     Ответить | Цитировать Сообщить модератору
 Re: Изменение процедуры  [new]
Henry Johnson
Member

Откуда:
Сообщений: 5
iljy
Henry Johnson,

учитесь мыслить множествами

SELECT e.Enterprise_code, MIN(Date), e.Name, case when AVG(i.Value) < 100 then 'Fail' else 'Vow!' end
FROM Dynamics_of_indicators i join Enterprises e on i.Enterprise_code = e.Enterprise_code
where '20160401' <= i.Date and i.Date < '20160501'
group by e.Enterprise_code, e.Name 

Не совсем понимаю как из вашего запроса поместить в переменную код предприятия, его название и case, чтобы потом все это записать в отчет. Возникает ошибка: не удалось выполнить привязку составного идентификатора.
 AS 
 DECLARE
	@ddate as datetime,
	@enterprisecode as int,	
	@enterprisename as varchar(20), 
    @efficiency as varchar(20)
SELECT e.Enterprise_code = @enterprisecode, Date = @ddate, e.Name = @enterprisename, case = @efficiency when AVG(i.Value) < 100 then 'Работа эффективна' else 'Работа не эффективна' end
FROM Dynamics_of_indicators i join Enterprises e on i.Enterprise_code = e.Enterprise_code
group by e.Enterprise_code, e.Name 
insert into Report_enterprises_performance(Date, Enterprise_code, Enterprise_name, Efficiency)
values (@ddate,@enterprisecode,@enterprisename,@efficiency)


Должен получиться результат в таблице отчета как на скрине, только для всех предприятий.

К сообщению приложен файл. Размер - 3Kb
25 апр 16, 00:13    [19100734]     Ответить | Цитировать Сообщить модератору
 Re: Изменение процедуры  [new]
iljy
Member

Откуда:
Сообщений: 8711
Henry Johnson,

из запроса не надо ничего ни в какие переменные, сразу в таблицу через INSERT ... SELECT. А синтаксические ошибки уж поправьте как-нибудь, ну и сам запрос подработайте под свои нужды.
25 апр 16, 01:14    [19100772]     Ответить | Цитировать Сообщить модератору
 Re: Изменение процедуры  [new]
Henry Johnson
Member

Откуда:
Сообщений: 5
iljy, Спасибо вам! Процедура работает.
26 апр 16, 01:30    [19105803]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить