Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите написать UPDATE с двумя условиями  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать UPDATE с двумя условиями  [new]
Руслан Дамирович
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать UPDATE с двумя условиями  [new]
cglcz
Member

Откуда:
Сообщений: 33
Руслан Дамирович,
да, спасибо)
14 май 18, 11:15    [21407485]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать UPDATE с двумя условиями  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать UPDATE с двумя условиями  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Bekzod,

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

cglcz
главное такие вещи не запускать больше одного раза :) а то с таким подходом никаких денег не хватит
14 май 18, 13:16    [21407943]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать UPDATE с двумя условиями  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать UPDATE с двумя условиями  [new]
katish444
Member

Откуда:
Сообщений: 261
TaPaK,
ахахаха насмешил)))
14 май 18, 13:22    [21407967]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать UPDATE с двумя условиями  [new]
Bekzod
Member

Откуда:
Сообщений: 67
TaPaK
Bekzod,
главное такие вещи не запускать больше одного раза :) а то с таким подходом никаких денег не хватит


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

cglcz,
себе дешевле не трогать исходные данные, создать к примеру доп.таблу перерасчёта... иначе потом забибикаешься разбирать умножил ли уже на коеффициент или нет.
14 май 18, 13:44    [21408044]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать UPDATE с двумя условиями  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
главное такие вещи не запускать больше одного раза :) а то с таким подходом никаких денег не хватит

Там все равно ограничение сверху, так что норм.
Все равно база учебная - пусть "виртуальные" sales порадуются большим зарплатам :)
14 май 18, 13:53    [21408094]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить