Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать UPDATE с двумя условиями / 9 сообщений из 9, страница 1 из 1
14.05.2018, 09:51
    #39644172
cglcz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать UPDATE с двумя условиями
-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 строк, а должна быть одна
...
Рейтинг: 0 / 0
14.05.2018, 10:45
    #39644233
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать UPDATE с двумя условиями
cglcz,
в задаче сказано умножить на 1.5, а ты умножаешь на 2 :)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
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]


сам допилишь?
...
Рейтинг: 0 / 0
14.05.2018, 11:15
    #39644270
cglcz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать UPDATE с двумя условиями
Руслан Дамирович,
да, спасибо)
...
Рейтинг: 0 / 0
14.05.2018, 13:10
    #39644357
Bekzod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать UPDATE с двумя условиями
cglcz, не проще что-то типа этого? можно и доп условия ставить, при необходимости... ну и как по мне это разобрать проще

Код: sql
1.
2.
3.
4.
5.
6.
7.
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
...
Рейтинг: 0 / 0
14.05.2018, 13:16
    #39644362
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать UPDATE с двумя условиями
Bekzod,

действительно, всегда проще обновлять всю таблицу целиком, так серверу не скучно

cglcz
главное такие вещи не запускать больше одного раза :) а то с таким подходом никаких денег не хватит
...
Рейтинг: 0 / 0
14.05.2018, 13:21
    #39644369
Bekzod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать UPDATE с двумя условиями
TaPaK,

зачем всю таблу... если задача только по одному условию то ясно что условие просто перенести в WHERE
Код: sql
1.
2.
3.
4.
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



я просто хотел чтобы человек понял что это работает, типо для таких задач
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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
...
Рейтинг: 0 / 0
14.05.2018, 13:22
    #39644373
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать UPDATE с двумя условиями
TaPaK,
ахахаха насмешил)))
...
Рейтинг: 0 / 0
14.05.2018, 13:44
    #39644396
Bekzod
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать UPDATE с двумя условиями
TaPaKBekzod,
главное такие вещи не запускать больше одного раза :) а то с таким подходом никаких денег не хватит

По поводу этого да, согласен))

cglcz,
себе дешевле не трогать исходные данные, создать к примеру доп.таблу перерасчёта... иначе потом забибикаешься разбирать умножил ли уже на коеффициент или нет.
...
Рейтинг: 0 / 0
14.05.2018, 13:53
    #39644404
Руслан Дамирович
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите написать UPDATE с двумя условиями
TaPaKглавное такие вещи не запускать больше одного раза :) а то с таким подходом никаких денег не хватит
Там все равно ограничение сверху, так что норм.
Все равно база учебная - пусть "виртуальные" sales порадуются большим зарплатам :)
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите написать UPDATE с двумя условиями / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]