Sql 如何创建此更新查询?

Sql 如何创建此更新查询?,sql,sql-server,Sql,Sql Server,如果col2和col3具有相同的“date”值,如何构造一个更新查询来遍历下表并将它们放在同一行上 新安排: ID col1 col2 col3 date 33 10 3/2/2010 35 NULL 200 300 3/2/2010 43 10 3/5/2010 45 NULL 200 NULL 3/7/2010 46 NULL NULL 310 3/8/2010 53 10

如果col2和col3具有相同的“date”值,如何构造一个更新查询来遍历下表并将它们放在同一行上

新安排:

ID col1  col2   col3  date
33  10                3/2/2010
35  NULL  200   300   3/2/2010
43  10                3/5/2010
45  NULL  200   NULL  3/7/2010
46  NULL  NULL  310   3/8/2010
53  10                3/9/2010
55  NULL  200   400   3/10/2010

请注意,仅col2和col3的日期更改为2010年3月2日和2010年3月10日。它们位于同一行,多余/旧的条目已被删除。

您不仅在更新,还在删除。如果您不想为此编写过程,我想最好的方法是选择结果并将其插入到临时表中,然后可能删除原始表并重命名临时表

insert into temptable
select min(id), col1, max(col2), max(col3), date
from origtable
group by col1, date

编辑:删除了col1中的最大值,因为您似乎只需要考虑col2和col3。

我认为更新查询不够,因为您必须删除/删除行。以下是select语句,它将为您提供所需的。。。但现在您需要决定是有选择地删除不必要的行还是删除所有行并重新填充新值

编辑:看起来我假设Col1可能有多行(因此,联合),如果可以消除Col1中的重复,您可以简单地通过将Col1添加到组中

SELECT ID, COL1, NULL AS COL2, NULL AS COL3, [DATE]
FROM TBL
UNION ALL
SELECT MIN(ID) AS ID, NULL AS COL1, MAX(COL2), MAX(COL3), [DATE]
FROM TBL
WHERE COL2 IS NOT NULL OR COL3 IS NOT NULL
GROUP BY [DATE]
我用这个来测试

create table tbl (id int, col1 int, col2 int, col3 int, [date] date)

insert into tbl
values (33,10,null,null,'3/2/2010'),
(35,NULL,200,NULL,'3/2/2010'),
(40,NULL,NULL,300,'3/2/2010'),
(43,10,null,null,'3/5/2010'),
(45,NULL,200,NULL,'3/7/2010'),
(46,NULL,NULL,310,'3/8/2010'),
(53,10,null,null,'3/9/2010'),
(55,NULL,200,NULL,'3/10/2010'),
(58,NULL,NULL,400,'3/10/2010')

您当前的数据

╔════╦══════╦══════╦══════╦════════════╗
║ ID ║ col1 ║ col2 ║ col3 ║    date    ║
╠════╬══════╬══════╬══════╬════════════╣
║ 33 ║ 10   ║ NULL ║ NULL ║ 2010-03-02 ║
║ 35 ║ NULL ║ 200  ║ NULL ║ 2010-03-02 ║
║ 40 ║ NULL ║ NULL ║ 300  ║ 2010-03-02 ║
║ 43 ║ 10   ║ NULL ║ NULL ║ 2010-03-05 ║
║ 45 ║ NULL ║ 200  ║ NULL ║ 2010-03-07 ║
║ 46 ║ NULL ║ NULL ║ 310  ║ 2010-03-08 ║
║ 53 ║ 10   ║ NULL ║ NULL ║ 2010-03-09 ║
║ 55 ║ NULL ║ 200  ║ NULL ║ 2010-03-10 ║
║ 58 ║ NULL ║ NULL ║ 400  ║ 2010-03-10 ║
╚════╩══════╩══════╩══════╩════════════╝
查询

更新记录

删除记录

结果集

╔════╦══════╦══════╦══════╦════════════╗
║ ID ║ col1 ║ col2 ║ col3 ║    date    ║
╠════╬══════╬══════╬══════╬════════════╣
║ 33 ║ 10   ║ NULL ║ NULL ║ 2010-03-02 ║
║ 35 ║ NULL ║ 200  ║ 300  ║ 2010-03-02 ║
║ 43 ║ 10   ║ NULL ║ NULL ║ 2010-03-05 ║
║ 45 ║ NULL ║ 200  ║ NULL ║ 2010-03-07 ║
║ 46 ║ NULL ║ NULL ║ 310  ║ 2010-03-08 ║
║ 53 ║ 10   ║ NULL ║ NULL ║ 2010-03-09 ║
║ 55 ║ NULL ║ 200  ║ 400  ║ 2010-03-10 ║
╚════╩══════╩══════╩══════╩════════════╝

我建议你尝试一下,然后告诉我们你尝试了什么,哪里出了问题。那么你需要
更新
删除
?为什么
ID=33
的行幸存了下来?他只想合并包含相同日期的第2列和第3列SQLServer的版本是什么?我们是否保证要合并的行中的
col1
NULL
?您将如何处理删除操作?@4thSpace:一个稍微修改过的版本,使用
MERGE
进行删除:
UPDATE T1
SET T1.Col2 = T2.Col2,
    T1.Col3 = T2.Col3
FROM Table_Name T1 INNER JOIN Table_Name T2
ON T1.[date] = T2.[date]
WHERE T1.col1 IS  NULL
;WITH Deletebles
AS
  (
   SELECT * , rn = ROW_NUMBER() 
                OVER (PARTITION BY Col2, Col3,[Date] ORDER BY [Date])
   FROM @t
  )
  DELETE FROM Deletebles
  WHERE rn >1
╔════╦══════╦══════╦══════╦════════════╗
║ ID ║ col1 ║ col2 ║ col3 ║    date    ║
╠════╬══════╬══════╬══════╬════════════╣
║ 33 ║ 10   ║ NULL ║ NULL ║ 2010-03-02 ║
║ 35 ║ NULL ║ 200  ║ 300  ║ 2010-03-02 ║
║ 43 ║ 10   ║ NULL ║ NULL ║ 2010-03-05 ║
║ 45 ║ NULL ║ 200  ║ NULL ║ 2010-03-07 ║
║ 46 ║ NULL ║ NULL ║ 310  ║ 2010-03-08 ║
║ 53 ║ 10   ║ NULL ║ NULL ║ 2010-03-09 ║
║ 55 ║ NULL ║ 200  ║ 400  ║ 2010-03-10 ║
╚════╩══════╩══════╩══════╩════════════╝