2014-01-07 40 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')