2017-02-09 4 views
0

У меня есть таблица вроде этого:SQL Insert Into Оператор Select с условием

enter image description here

Я хочу, чтобы вставить в detail_salary_table с Вставка в Select заявление. я могу вставить элемент salary_component «Зарплатный» с этим кодом

INSERT INTO detail_salary_table (date_work, id_emp, salary_component, nominal) 
    SELECT 
     date_work, id_emp, 'Salary', 
     IIF(DATEDIFF(minute, start_work, finish_work) > 480, 10000, round(convert(float(53), datediff(minute, start_work, finish_work))/480, 1) * 10000) 
    FROM 
     attendance_table 

Как вставить элемент salary_component «Сверхурочная работа» с T-SQL, как на картинке?

Если я использую VB.NET, я могу сделать это с помощью инструкции if и loop.

Примечание:

  • 480 является исправление. 10.000 - это исправление.
  • overtime = finish_work - start_work - 480. Он принимает номинал от overtime_rate_table, где значение, близкое к time_in_minutes
  • прирост номинала в overtime_rate_table не измеряется. (Так, я не могу использовать * 1000) (пример измеряется)

SQL-код для создания таблиц и выборки данных:

create table employee_table 
(
    id_emp int primary key, 
    name_emp varchar(200) 
); 
GO 

create table attendance_table 
(
    id_data int primary key identity(1,1), 
    date_work date, 
    id_emp int, 
    start_work datetime, 
    finish_work datetime 
); 
GO 

create table overtime_rate_table 
(
    id_data int, 
    time_in_minutes int, 
    nominal money 
); 
GO 

create table detail_salary_table 
(
    id_data int primary key identity(1,1), 
    date_work date, 
    id_emp int, 
    salary_component varchar(100), 
    nominal money 
); 
GO 

insert into employee_table 
values (1, 'Emp A'), (2, 'Emp B'), (3, 'Emp C'), (4, 'Emp D'), (5, 'Emp E'); 
GO 

insert into attendance_table (date_work, id_emp, start_work, finish_work) 
values 
    ('2017-02-01',1,'2017-02-01 08:00','2017-02-01 16:52'), 
    ('2017-02-01',2,'2017-02-01 07:45','2017-02-01 16:48'), 
    ('2017-02-01',3,'2017-02-01 08:02','2017-02-01 12:05'), 
    ('2017-02-01',4,'2017-02-01 07:56','2017-02-01 16:49'), 
    ('2017-02-01',5,'2017-02-01 07:30','2017-02-01 18:05'), 
    ('2017-02-02',1,'2017-02-02 07:52','2017-02-02 16:23'), 
    ('2017-02-02',2,'2017-02-02 07:19','2017-02-02 18:56'), 
    ('2017-02-02',3,'2017-02-02 07:55','2017-02-02 18:23'), 
    ('2017-02-02',4,'2017-02-02 08:01','2017-02-02 16:01'), 
    ('2017-02-02',5,'2017-02-02 07:31','2017-02-02 16:49'), 
    ('2017-02-03',1,'2017-02-03 07:52','2017-02-03 17:44'), 
    ('2017-02-03',2,'2017-02-03 07:41','2017-02-03 17:23'), 
    ('2017-02-03',3,'2017-02-03 07:06','2017-02-03 17:56'), 
    ('2017-02-03',4,'2017-02-03 07:56','2017-02-03 19:00'), 
    ('2017-02-03',5,'2017-02-03 07:45','2017-02-03 18:56'); 
GO 

insert into overtime_rate_table 
values (1, 15, 1000), (2, 30, 2000), (3, 45, 3000), 
     (4, 60, 4000), (5, 75, 5000), (6, 90, 6000), 
     (7, 105, 7000), (8, 120, 8000), (9, 135, 9000), 
     (10, 150, 10000), (11, 165, 11000), (12, 180, 12000), 
     (13, 195, 13000), (14, 210, 14000), (15, 225, 15000); 
GO 
+0

Ваш данный запрос ** не может ** вставить те строк. Вероятно, они были добавлены раньше. – GurV

+0

[Как создать пример ** Минимальный **, Полный и проверенный пример] (http://stackoverflow.com/help/mcve) –

ответ

0
INSERT INTO detail_salary_table 
(date_work, 
id_emp, 
salary_component, 
nominal 
) 
     SELECT date_work, 
       id_emp, 
       'OverTime', 
       ISNULL(o.Nominal, 0) 
     FROM attendance_table a 
      LEFT JOIN overtime_rate_table o ON CONVERT(INT, DATEDIFF(minute, a.start_work, a.finish_work) - 480)/15 * 15 = o.time_in_minutes;