Вот как вы можете получать данные, за исключением дней недели:
select t2.EmployeeID, EmployeeName, MonHours, lunchtotal + sum(Clock.ClockOut - Clock.ClockIn) as MonBreak
from
(
select t.EmployeeID, EmployeeName, MonHours, sum(Lunch.ClockOut - Lunch.ClockIn) as lunchtotal
from
(
select Employee.EmployeeID concat(FirstName, ' ', LastName) as EmployeeName, sum(Hours.ClockOut - Houts.ClockIn) as MonHours
from Employee
join Hours on Employee.EmployeeID = Hours.EmployeeID
group by Employee.EmployeeID
) t
join Lunch on t.EmployeeID = Lunch.EmployeeID
group by t.EmployeeID
) t2
join Clock on t2.EmployeeID = Clock.EmployeeID
group by t2.EmployeeID
Вы также можете найти способ различать дни недели, используя DAYOFWEEK и [112 ] регистр синтаксиса . Вам нужно будет использовать их и разумно комбинировать их с суммой.
вы можете начать с max (trans_seq_no) + 1.
смотреть:
SQL> create table my_numbers(my_number number not null primary key);
Table created.
SQL> insert into my_numbers(select rownum from user_objects);
260 rows created.
SQL> select max(my_number) from my_numbers;
MAX(MY_NUMBER)
--------------
260
SQL> create sequence my_number_sn start with 260;
Sequence created.
SQL> insert into my_numbers(my_number) values (my_number_sn.NEXTVAL);
insert into my_numbers(my_number) values (my_number_sn.NEXTVAL)
*
ERROR at line 1:
ORA-00001: unique constraint (NEIL.SYS_C00102439) violated
Когда вы создаете последовательность с номером, вы должны помнить, что первый Если вы выберете последовательность, Oracle вернет начальное значение, которое вы ей присвоили.
SQL> drop sequence my_number_sn;
Sequence dropped.
SQL> create sequence my_number_sn start with 261;
Sequence created.
SQL> insert into my_numbers(my_number) values (my_number_sn.NEXTVAL);
1 row created.
Если вы пытаетесь сделать «пустую» вещь, я настоятельно советую вам
Если вы можете использовать PL / SQL, попробуйте (РЕДАКТИРОВАТЬ: включает предложение Нила xlnt начать со следующего более высокого значения):
SELECT 'CREATE SEQUENCE transaction_sequence MINVALUE 0 START WITH '||MAX(trans_seq_no)+1||' INCREMENT BY 1 CACHE 20'
INTO v_sql
FROM transaction_log;
EXECUTE IMMEDIATE v_sql;
Еще один момент, который следует учитывать: установив для параметра CACHE значение 20, вы рискуете потерять до 19 значений в вашей последовательности, если база данных выйдет из строя. Значения CACHEd теряются при перезапуске базы данных. Если вы не выполняете последовательность слишком часто или вас не волнуют пропуски, я бы установил ее равной 1.
И последнее замечание: значения, которые вы указали для CACHE и INCREMENT BY, являются значениями по умолчанию. Вы можете оставить их и получить тот же результат.
Вы не можете использовать подвыбор внутри оператора CREATE SEQUENCE
. Вам нужно будет заранее выбрать значение.
Поместите посередине, значение MAX будет максимальным только из зафиксированных значений . Он может вернуть 1234, и вам может потребоваться учесть, что кто-то уже вставил 1235, но не зафиксировал.
используйте динамический sql
BEGIN
DECLARE
maxId NUMBER;
BEGIN
SELECT MAX(id)+1
INTO maxId
FROM table_name;
execute immediate('CREATE SEQUENCE sequane_name MINVALUE '||maxId||' START WITH '||maxId||' INCREMENT BY 1 NOCACHE NOCYCLE');
END;
END;