SQL ВСТАВИТЬ несколько записей в новую таблицу из 1 записи в существующей таблице с вычисленными colmns

#sql #function #insert #while-loop #calculated-field

#sql #функция #вставить #цикл while #вычисляемое поле

Вопрос:

В качестве примера у меня есть следующие данные:

 EMP NR  Date    Hours1  Hours2  Hours3  Hours4  Dep Man
1234    16/06/2014  9.5 3   0   0   13  2
1235    16/06/2014  9.5 8   2   8   12  6
1236    16/06/2014  9.5 0   0   0   11  2
  

Затем мне нужно добавить данные в новую таблицу, которая просматривает первую запись в первой таблице и для столбцов Hours1, Hours2, Hours3 и Hours 4 добавляет новую запись в новую таблицу часов для каждого столбца, а также вычисленное значение для того, из какого столбца оно было получено. Если значение любого из столбцов часов равно 0, его следует игнорировать.

 EMP NR  HRS Cat Hours   Dep Man
1234    1   9.5 13  2
1234    2   3   13  2
1235    1   9.5 12  6
1235    2   8   12  6
1235    3   2   12  6
1235    4   8   12  6
1236    1   9.5 11  2
  

Таким образом, в некоторых случаях во 2-й таблице имеется несколько записей для одной записи в первой таблице.

Если кто-нибудь знает, как это можно сделать в SQL с помощью хранимой процедуры или даже оператора select, я был бы очень признателен.

Моя идея о том, как это сделать, заключалась бы в написании хранимой процедуры, которая выбирает существующие данные и с помощью цикла while выполняет требуемые вычисления, а затем добавляет данные в новую таблицу, я просто застрял на том, как это сделать.

Ответ №1:

как насчет 4 разных выборок? SELECT EMP_NR, Hours1 INTO new_table FROM orig_table WHERE Hours1 <> 0
SELECT EMP_NR, Hours2 INTO new_table FROM orig_table WHERE Hours1 <> 0
и т.д…

Ответ №2:

Вы должны быть в состоянии сделать это в одном объединении, указав HRS Cat константу в каждой части:

 select "EMP NR", 1 as "HRS Cat", Hours1 as Hours, Dep, Man
from Table1
where Hours1 <> 0
union all
select "EMP NR", 2 as "HRS Cat", Hours2 as Hours, Dep, Man
from Table1
where Hours2 <> 0
union all
select "EMP NR", 3 as "HRS Cat", Hours3 as Hours, Dep, Man
from Table1
where Hours3 <> 0
union all
select "EMP NR", 4 as "HRS Cat", Hours4 as Hours, Dep, Man
from Table1
where Hours4 <> 0
  

Возможно, я что-то упускаю, потому что вы упоминаете «вычисления», а здесь их нет.

Ответ №3:

Приведенный ниже запрос insert, вероятно, поможет вам:

 INSERT INTO TABLE2 (EMP_NR, HRS_CAT, HOURS, DEP, MAN)
SELECT EMP_NR, 1 HRS_CAT, HOURS1 AS HOURS, DEP, MAN
   FROM TABLE1
   WHERE HOURS1 <> 0
UNION ALL
SELECT EMP_NR, 2 HRS_CAT, HOURS2 AS HOURS, DEP, MAN
   FROM TABLE1
   WHERE HOURS2 <> 0
UNION ALL
SELECT EMP_NR, 3 HRS_CAT, HOURS3 AS HOURS, DEP, MAN
   FROM TABLE1
   WHERE HOURS3 <> 0
UNION ALL
SELECT EMP_NR, 4 HRS_CAT, HOURS4 AS HOURS, DEP, MAN
   FROM TABLE1
   WHERE HOURS4 <> 0;
  

Синтаксис

 INSERT INTO table_name
(column_name(s))
SELECT column_name(s)
FROM table1;