根据另一个表更新一个表的列

问题描述 投票:0回答:1

我在 SQL Server 中工作,我有空表 Customer 和如下所示的表 Manager:

___________________________
|         Manager         |
|=========================|
| ID   Cust     RefDate   |
|-------------------------|
|  1     A    2023-01-31  |
|  2     B    2023-02-28  |
|  3     C    2023-03-31  |
|  4     A    2023-04-30  |
|  5     B    2023-05-31  |
|  6     A       NULL     |
|________________________ |

然后,我从 Manager 表插入 Customer 表,现在 Customer 表如下所示:

_______________________________________
|             Customer                |
|=====================================|
| ID   Cust     FROM          TO      |
|------------------------------------ |
|  1     A      NULL      2023-01-31  |
|  2     B      NULL      2023-02-28  |
|  3     C      NULL      2023-03-31  |
|  4     A      NULL      2023-04-30  |
|  5     B      NULL      2023-05-31  |  
|  6     A      NULL         NULL     | 
|_____________________________________|

然后我使用以下更新代码:

;WITH From_Table AS
( 
        select CustomerName as CustomerName, 
            [SalesManager], 
            lag([To], 1)  OVER(ORDER BY [CustomerKey] ASC) as TargetDate --, [To]
        FROM Customer
)

UPDATE Customer
SET [Customer].[From] = DATEADD(day, 1, Max_From)

FROM
(
    SELECT dd.CustomerName, dd.SalesManager, dd.[To], dd.[From], MAX(ff.TargetDate) as Max_From
    FROM From_Table AS ff
    INNER JOIN Customer AS dd
    ON ff.CustomerName = dd.CustomerName AND ff.SalesManager = dd.SalesManager
    GROUP BY dd.CustomerName, dd.SalesManager, dd.[To], dd.[From]
    --HAVING dd.[To] IS NULL AND dd.[From] IS NULL
) AS final
INNER JOIN Customer fd
ON fd.CustomerName = final.CustomerName AND fd.SalesManager = final.SalesManager
WHERE fd.[From] IS NULL

我得到这个结果:

_______________________________________
|             Customer                |
|=====================================|
| ID   Cust     FROM          TO      |
|------------------------------------ |
|  1     A   2023-04-01   2023-01-31  |
|  2     B   2023-05-01   2023-02-28  |
|  3     C   2023-03-01   2023-03-31  |
|  4     A   2023-04-01   2023-04-30  |
|  5     B   2023-05-01   2023-05-31  |
|  6     A   2023-04-01      NULL     |
|_____________________________________|

但我想要的是下面的结果:

_______________________________________
|             Customer                |
|=====================================|
| ID   Cust     FROM          TO      |
|------------------------------------ |
|  1     A      NULL      2023-01-31  |
|  2     B   2023-02-01   2023-02-28  |
|  3     C   2023-03-01   2023-03-31  |
|  4     A   2023-04-01   2023-04-30  |
|  5     B   2023-05-01   2023-05-31  |  
|  6     A   2023-06-01      NULL     |
|_____________________________________|

你知道如何实现它吗? 另外,我想提一下,日期不会是月底和月初。

sql sql-server sql-update sql-insert
1个回答
0
投票

我想你正在寻找这样的东西:

LAG()
获取当前行之前的行。

UPDATE c
SET [FROM] = newFrom
FROM Customer c
JOIN (
  select ID, 
  DATEADD(day, 1, lag([To]) OVER(ORDER BY ID)) as newFrom
  FROM Customer
) s on s.ID = c.ID;

这里演示

© www.soinside.com 2019 - 2024. All rights reserved.