Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
cglcz Member Откуда: Сообщений: 33 |
-1 голос «против» избранное Есть три таблицы: CREATE TABLE departments ( id INT NOT NULL, departments_name varchar (50) NULL, PRIMARY KEY (id) ); CREATE TABLE employees ( id int NOT NULL, first_name varchar(50) NULL, last_name varchar(50) NULL, department_id int NULL, salary money NULL, PRIMARY KEY (id), FOREIGN KEY (department_id) REFERENCES departments (id) ); CREATE TABLE sales ( employee_id int NOT NULL, sales_time datetime NOT NULL, amount money NULL, PRIMARY KEY (employee_id, sales_time), FOREIGN KEY (employee_id) REFERENCES employees (id) ); Есть три таблицы: CREATE TABLE departments ( id INT NOT NULL, departments_name varchar (50) NULL, PRIMARY KEY (id) ); CREATE TABLE employees ( id int NOT NULL, first_name varchar(50) NULL, last_name varchar(50) NULL, department_id int NULL, salary money NULL, PRIMARY KEY (id), FOREIGN KEY (department_id) REFERENCES departments (id) ); CREATE TABLE sales ( employee_id int NOT NULL, sales_time datetime NOT NULL, amount money NULL, PRIMARY KEY (employee_id, sales_time), FOREIGN KEY (employee_id) REFERENCES employees (id) ); Обновить значение salary в таблице employees установив заработные платы для сотрудников по следующим правилам: Если выручка меньше 10000, но больше чем 20 * salary сотрудника - умножить значение salary на 1.5. Мой запрос: UPDATE employees SET salary = salary * 2 WHERE EXISTS ( SELECT 1 FROM sales s WHERE s.employee_id = employees.id AND YEAR(CAST(sales_time AS DATE)) = 2017 group by s.employee_id HAVING sum(s.amount) < 10000 AND sum(s.amount) > ( SELECT salary * 20 FROM employees e where e.id = s.employee_id) ) Обрабатывает 0 строк, а должна быть одна |
14 май 18, 09:51 [21407211] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
cglcz, в задаче сказано умножить на 1.5, а ты умножаешь на 2 :) WITH s AS ( SELECT [employee_id], [sum_amount] = SUM( [amount] ) FROM [sales] GROUP BY [employee_id] ) UPDATE e SET e.[salary] = e.[salary] * 1.5 FROM s INNER JOIN [employees] e ON ( e.[id] = s.[employee_id] ) WHERE s.[sum_amount] < 10000 AND s.[sum_amount] > 20 * e.[salary] сам допилишь? |
14 май 18, 10:45 [21407367] Ответить | Цитировать Сообщить модератору |
cglcz Member Откуда: Сообщений: 33 |
Руслан Дамирович, да, спасибо) |
14 май 18, 11:15 [21407485] Ответить | Цитировать Сообщить модератору |
Bekzod Member Откуда: Сообщений: 67 |
cglcz, не проще что-то типа этого? можно и доп условия ставить, при необходимости... ну и как по мне это разобрать прощеupdate e set e.sallary = case when s.sum_amount < 10000 and s.sum_amount > 20 * e.sallary then e.sallary * 1.5 else e.sallary end from employees e join sales s on e.id = s.employee_id |
14 май 18, 13:10 [21407924] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
Bekzod, действительно, всегда проще обновлять всю таблицу целиком, так серверу не скучно cglcz главное такие вещи не запускать больше одного раза :) а то с таким подходом никаких денег не хватит |
14 май 18, 13:16 [21407943] Ответить | Цитировать Сообщить модератору |
Bekzod Member Откуда: Сообщений: 67 |
TaPaK, зачем всю таблу... если задача только по одному условию то ясно что условие просто перенести в WHERE update e set e.sallary = e.sallary * 1.5 from employees e join sales s on e.id = s.employee_id where s.sum_amount < 10000 and s.sum_amount > 20 * e.sallary я просто хотел чтобы человек понял что это работает, типо для таких задач update e set e.sallary = case when s.sum_amount < 10000 and s.sum_amount > 20 * e.sallary then e.sallary * 1.5 when ... then ... when ... then ... when ... then ... else e.sallary end from employees e join sales s on e.id = s.employee_id |
14 май 18, 13:21 [21407960] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
TaPaK, ахахаха насмешил))) |
14 май 18, 13:22 [21407967] Ответить | Цитировать Сообщить модератору |
Bekzod Member Откуда: Сообщений: 67 |
По поводу этого да, согласен)) cglcz, себе дешевле не трогать исходные данные, создать к примеру доп.таблу перерасчёта... иначе потом забибикаешься разбирать умножил ли уже на коеффициент или нет. |
||
14 май 18, 13:44 [21408044] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
Там все равно ограничение сверху, так что норм. Все равно база учебная - пусть "виртуальные" sales порадуются большим зарплатам :) |
||
14 май 18, 13:53 [21408094] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |