Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用大小写表达式从另一个表更新表_Sql_Sql Server_Sql Update_Case - Fatal编程技术网

Sql 使用大小写表达式从另一个表更新表

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

当“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,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