akhter86 Ответов: 2

Как обновить таблицу с помощью левого соединения между двумя таблицами?


У меня есть два стола один стоит Employee Стол и еще один есть EmployeeAttendance Теперь я пытаюсь обновить INTIME и OUTTIME в EmployeeAttendance затем остальные значения столбцов вычисляются в соответствии с запросом и условием ..я пытался, но не получил результата..

Что я уже пробовал:

Update EmployeesAttendance 
set  EmployeesAttendance.INTIME=@INTime,
EmployeesAttendance.OUTTIME=@OUTTIME
where EmployeesAttendance.AttdID=EmployeesAttendance.AttdID AND

     Case When (DATEDIFF(Hour, INTIME,OUTTIME)) = Hours 

    CASE WHEN  EmployeesAttendance.Hours >= 8 THEN 1
    WHEN  EmployeesAttendance.Hours = 0 THEN 0
    WHEN  EmployeesAttendance.Hours >= 6 THEN 0.5  Day,
    CASE WHEN  EmployeesAttendance.Hours > EmployeeDetails.Dhour then  
    EmployeesAttendance .Hours - EmployeesAttendance .Dhour else 0 End as OT,
    CASE when   EmployeeDetails.OTEntitled = 'Yes' 
     AND EmployeesAttendance .Hours >= EmployeeDetails.Dhour 
THEN (( EmployeesAttendance.Hours - 8) * 100) else 0 END AS OTAmount,  

   
    Convert(varchar(10), EmployeesAttendance .INTIME,108) as Time,
   Case When Convert(Time, EmployeesAttendance .INTIME,108) > cte.LTime Then 1 else 0 end as Late    
    from EmployeeDetails 
		Left Join EmployeesAttendance ON EmployeeDetails.EmpId = EmployeesAttendance.EmpID
    order by EmployeeDetails.EmpID asc 

2 Ответов

Рейтинг:
20

MadMyche

Общий формат выполнения обновления на основе соединения аналогичен выполнению выбора; я использовал этот формат как с внутренними, так и с внешними соединениями.

UPDATE d
SET    d.DestValue1 = s.SourceValue1
FROM   DestinationTable d
JOIN   SourceTable      s ON d.TableIndex = s.TableIndex
Это будет до вас, чтобы получить ваши сопоставления таблиц прямо

Обновление
Как Maciej Los как указано в другом ответе, у вас действительно есть некоторые проблемы с вашим синтаксисом, о которых следует позаботиться
CASE
    WHEN  EmployeesAttendance.Hours >= 8 THEN 1
    WHEN  EmployeesAttendance.Hours = 0 THEN 0
    WHEN  EmployeesAttendance.Hours >= 6 THEN 0.5  Day, -- error here

CASE
    WHEN  EmployeesAttendance.Hours > EmployeeDetails.Dhour then  EmployeesAttendance .Hours - EmployeesAttendance .Dhour 
    else 0
End as OT,
Здесь нет END к первому утверждению.
Результаты будут равны нулю между 0 и 6 часами.
Я также вообще рекомендую не использовать Зарезервированные/Специальные Слова как имена столбцов; если они должны быть использованы, то они должны быть обернуты с помощью [] (например, дни, часы). Мое эмпирическое правило заключается в том, что если имя столбца или переменной меняет цвет в C# или TSQL, измените это имя.

Я выполнил следующие утверждения, и вы можете увидеть, как это работает с некоторыми реальными данными
declare @EmployeeAttendance table(id int identity(1,1), [hours] decimal(9,2) )

insert @EmployeeAttendance values (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)

SELECT ID, [HOURS],
  CASE
    WHEN  EmployeesAttendance.[Hours] >= 8 THEN 1
    WHEN  EmployeesAttendance.[Hours]  = 0 THEN 0
    WHEN  EmployeesAttendance.[Hours]  >= 6 THEN 0.5
END AS [Day]
FROM @EmployeeAttendance EmployeesAttendance
ORDER BY 1
Который вернул следующее
ID	HOURS	Day
1	0.00	0.0
2	1.00	NULL
3	2.00	NULL
4	3.00	NULL
5	4.00	NULL
6	5.00	NULL
7	6.00	0.5
8	7.00	0.5
9	8.00	1.0
10	9.00	1.0
11	10.00	1.0
Так что похоже у тебя еще есть кое какая работа


akhter86

MadMyche

я разработал SP,он просто обновляет INTTIME и OUTIME остальные значения столбцов не получают calculate....пожалуйста, просмотрите мой код

Обновление EmployeesAttendance
установите сотрудников на место.INTIME=@INTime,
Подчинение сотрудников.OUTTIME=@OUTTIME,

Подчинение сотрудников.Hours= ( (DATEDIFF(Hour,INTIME,OUTTIME))),
Подчинение сотрудников.День=( случай, когда сотрудники уходят.Часов >= 8, затем 1
Когда сотрудники приступают к работе.Часы = 0, затем 0
Когда сотрудники приступают к работе.Часов >= 6, затем 0,5 конца),
Подчинение сотрудников.OT=(случай, когда EmployeesAttendance.Часы работы > EmployeeDetails.Тогда дхур
Подчинение сотрудников.Часы Работы - EmployeeDetails.Дхур, иначе 0 конец),
Подчинение сотрудников.OTAmount =(случай, когда EmployeeDetails.OTEntitled = "Да"
И подчинение сотрудников .Часы работы >= EmployeeDetails.Дхур
Затем (( EmployeesAttendance.Часов - 8) * 100) еще 0 конец ),
Подчинение сотрудников.Time=( Convert(varchar(10),EmployeesAttendance.Интайм,108)),
Подчинение сотрудников.Поздно=(Случай, Когда Преобразования(Время, EmployeesAttendance .INTIME,108) > EmployeeDetails.LTime тогда 1 иначе 0
конец)
От EmployeeDetails
INNER Join EmployeesAttendance ON EmployeeDetails.Empid В = EmployeesAttendance.Empid в
-- Заказ по EmployeeDetails.Empid в АСК
там, где работают сотрудники.AttdID=@AttdID

Maciej Los

5ed!

Рейтинг:
0

Maciej Los

Взгляните глубже на свое лицо. CASE ... WHEN состояние:

CASE WHEN  EmployeesAttendance.Hours >= 8 THEN 1
 ...
    WHEN  EmployeesAttendance.Hours >= 6 THEN 0.5  Day,


Кажется, вам следует заменить [>] На [<] во втором условии.


MadMyche

Хороший улов, но на самом деле он должен работать, хотя, возможно, и не так, как задумано. Кейс следует по первому пути, которому он соответствует, и игнорирует остальные.

akhter86

мой этот запрос отлично работает на select, но не работает на update?

Maciej Los

Какой ваш база данных[^]?

akhter86

sql server 2008 r2

Maciej Los

Итак, следуйте решению 2

akhter86

какое решение

Maciej Los

автор MadMyche