2014-01-07 41 views
-1

如何构建一个更新查询,它将通过下表并将任何col2和col3放在同一行(如果它们具有相同的“日期”值)?如何创建此更新查询?

ID col1 col2 col3 date 
33 10    3/2/2010 
35 NULL 200 NULL 3/2/2010 
40 NULL NULL 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 NULL 3/10/2010 
58 NULL NULL 400 3/10/2010 

的新安排:

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 

通告日期3/2/2010和3/10/2010只COL2和COL3的变化。它们在同一行上,并且额外/旧条目已被删除。

+3

我建议你做一个尝试,然后告诉我们你尝试过什么地方出了错。 – showdev

+1

那么你需要'UPDATE'和'DELETE'呢?为什么'ID = 33'这一行存活了? –

+0

他只想组合包含相同日期的列2和列3 –

回答

1

当前数据

╔════╦══════╦══════╦══════╦════════════╗ 
║ 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 ║ 
╚════╩══════╩══════╩══════╩════════════╝ 

查询

更新记录

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 ║ 
╚════╩══════╩══════╩══════╩════════════╝ 
1

你不仅更新,你也删除。如果你不想为此编写程序,我想最好的办法是选择结果并将其插入临时表 - 然后可能删除原始表并重命名临时表。

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

编辑:从col1中删除了max,因为您似乎只想考虑col2和col3。

+0

你将如何处理删除? – 4thSpace

+0

@ 4thSpace:使用'MERGE'删除的一些修改版本:http://sqlfiddle.com/#!6/354e8/43 – a1ex07

-1

我不认为更新查询将是足够的,因为你必须删除/删除行。这里是选择声明,会给你你需要的...但现在你需要决定是否要选择性地删除不必要的行或删除所有行,并重新填充新的值。

编辑:貌似我做了一个假设,即有可能是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')