Sql 使用大小写表达式从另一个表更新表
当“statustype”=out时,我想从“DateAttent”列中的表“dailydata”更新表“dailydatawh”中的列“statusout”Sql 使用大小写表达式从另一个表更新表,sql,sql-server,sql-update,case,Sql,Sql Server,Sql Update,Case,当“statustype”=out时,我想从“DateAttent”列中的表“dailydata”更新表“dailydatawh”中的列“statusout” UPDATE DAILYDATAWH SET STATUSOUT= (SELECT (case when STATUSTYPE='OUT' then DATEATTEND end)as STATUSOUT FROM DAILYDATA GROUP By NIP,NAME,DEPARTMENT,DATEATTEND,STATUSTYP
UPDATE DAILYDATAWH
SET STATUSOUT=
(SELECT
(case when STATUSTYPE='OUT' then DATEATTEND end)as STATUSOUT
FROM DAILYDATA
GROUP By NIP,NAME,DEPARTMENT,DATEATTEND,STATUSTYPE)
WHERE STATUSOUT = NULL
--
在我尝试下面的答案之后
此查询是有效的,但当我在表DAILYDATA中输入新数据(NIP、姓名、部门、DateAttain、STATUSTYPE)时,“STATUSOUT”(表DAILYDATAWH)中的新值仍然显示在前一个日期
这是带有查询的当前输出:
这是示例输入
这是示例输出
您可以内部联接表(这里我假设它基于列NIP
,因为没有提供实际信息)
更新的查询
UPDATE DDW
SET STATUSOUT = DD.DATEATTEND
FROM dailydatawh DDW
INNER JOIN
(
SELECT NIP, NAME, DEPARTMENT, DATEATTEND = MAX(DATEATTEND)
FROM dailydata
WHERE STATUSTYPE = 'OUT'
GROUP BY NIP, NAME, DEPARTMENT
) DD ON DDW.NIP = DD.NIP
AND DDW.NAME = DD.NAME
AND DDW.DEPARTMENT = DD.DEPARTMENT
WHERE DDW.STATUSOUT IS NULL
更新了查询#2
这是将插入和更新合并到单个查询中的查询
; WITH CTE AS
(
SELECT *, RN = ROW_NUMBER() OVER (PARTITION BY NIP, NAME, DEPARTMENT
ORDER BY DATEATTEND)
FROM DAILYDATA
)
INSERT INTO DAILYDATAWH (NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT)
SELECT NIP, NAME, DEPARTMENT, STATUSIN = MIN(DATEATTEND), STATUSOUT = MAX(DATEATTEND)
FROM CTE
GROUP BY NIP, NAME, DEPARTMENT, (RN - 1) / 2
您的问题是什么?对不起,我的问题是当statustype=out时,如何从该表中更新包含“DateAttent”的列“statusout”。我一直在尝试该查询,但仍然无法确定这两个表的关系(列名)是什么?@Squirrel我还没有确定,但我认为列“NIP+name”可以是关系,因为不能与其他人相同。应始终将完整值与“STATUSOUT is NULL”进行比较。注释不用于扩展讨论;这段对话一直是。我想这么做,但似乎没有任何选择。对不起,我不知道怎么做
UPDATE DDW
SET STATUSOUT = DD.DATEATTEND
FROM dailydatawh DDW
INNER JOIN dailydata DD ON DDW.NIP = DD.NIP
AND DDW.NAME = DD.NAME
AND DDW.DEPARTMENT = DD.DEPARTMENT
WHERE DD.STATUSTYPE = 'OUT'
UPDATE DDW
SET STATUSOUT = DD.DATEATTEND
FROM dailydatawh DDW
INNER JOIN
(
SELECT NIP, NAME, DEPARTMENT, DATEATTEND = MAX(DATEATTEND)
FROM dailydata
WHERE STATUSTYPE = 'OUT'
GROUP BY NIP, NAME, DEPARTMENT
) DD ON DDW.NIP = DD.NIP
AND DDW.NAME = DD.NAME
AND DDW.DEPARTMENT = DD.DEPARTMENT
WHERE DDW.STATUSOUT IS NULL
UPDATE DDW
SET STATUSOUT = DD.DATEATTEND
FROM dailydatawh DDW
CROSS APPLY
(
SELECT TOP 1 d.DATEATTEND
FROM dailydata d
WHERE d.STATUSTYPE = 'OUT'
AND d.NIP = DDW.NIP
AND d.NAME = DDW.NAME
AND d.DEPARTMENT = DDW.DEPARTMENT
ORDER BY d.ID DESC
) DD
WHERE DDW.STATUSOUT IS NULL
; WITH CTE AS
(
SELECT *, RN = ROW_NUMBER() OVER (PARTITION BY NIP, NAME, DEPARTMENT
ORDER BY DATEATTEND)
FROM DAILYDATA
)
INSERT INTO DAILYDATAWH (NIP, NAME, DEPARTMENT, STATUSIN, STATUSOUT)
SELECT NIP, NAME, DEPARTMENT, STATUSIN = MIN(DATEATTEND), STATUSOUT = MAX(DATEATTEND)
FROM CTE
GROUP BY NIP, NAME, DEPARTMENT, (RN - 1) / 2