2014-01-23 86 views
2
CREATE TABLE #Table1 
(
    ID INT Identity (1,1), Col1 varchar(10), 
    Col2 DateTime2(7), Col3 INT, COl4 INT 
); 

INSERT INTO #Table1 VALUES 
('Part1','2014-01-23 22:00:00.0000000', NULL, NULL), 
('Part2','2014-01-23 23:00:00.0000000', NULL, NULL), 
('Part3','2014-01-23 23:00:00.0000000', NULL, NULL), 
('Part3','2014-01-23 23:30:00.0000000', NULL, NULL); 

CREATE TABLE #Table2 
(
    ID INT Identity (1,1), C1 varchar(10), C2 varchar(10), 
    C3 bit, C4 Varchar(10), C5 DateTime2(7) 
); 

INSERT INTO #Table2 VALUES 
('One', 'First', 1, 'Part1','2014-01-23 22:00:00.0000000'), 
('Two', 'Second', 1, 'Part1','2014-01-23 22:00:00.0000000'), 
('Three', 'Third', 0, 'Part1','2014-01-23 22:00:00.0000000'), 
('Four', 'Fourth', 1, 'Part2','2014-01-23 23:00:00.0000000'), 
('Five', 'Fifth', 0, 'Part2','2014-01-23 23:00:00.0000000'), 
('Six', 'Sixth', 1, 'Part3','2014-01-23 23:00:00.0000000'), 
('Seven', 'Seventh', 1, 'Part3','2014-01-23 23:00:00.0000000'), 
('Eight', 'Eight', 0, 'Part3','2014-01-23 23:30:00.0000000'); 

我想基於這個條件#Table1#Table2之間的匹配來更新#Table1UPDATE基於聚合 - T/SQL

ON T1.Col1 = T2.C4 AND T1.Col2 = T2.C5 

和總T2.C3值,爲T1.Col3T1.Col4其中更新值:

T1.Col3 = COUNT(T2.C3 WHERE T2.C3 = 1) 
T1.Col4 = COUNT(T2.C3 WHERE T2.C3 = 0) 

預計內容#Table1更新後:

ID Col1 Col2    Col3 Col4 
-- ----- ---------------- ---- ---- 
1 Part1 2014-01-23 22:00 2  1 
2 Part2 2014-01-23 23:00 1  1 
3 Part3 2014-01-23 23:00 2  0 
4 Part3 2014-01-23 23:30 0  1 

我的不成功嘗試的更新:

UPDATE T1 
SET T1.Col3 = SUM(CASE WHEN T2.C3 = 1 THEN 1 ELSE 0 END) 
,T1.Col4 = SUM(CASE WHEN T2.C3 = 0 THEN 1 ELSE 0 END) 
FROM #Table1 T1 INNER JOIN #Table2 T2 
    ON T1.Col1 = T2.C4 AND T1.Col2 = T2.C5 

這種失敗:

消息157,15級,狀態1,第33行
聚合不應出現在UPDATE語句的集合列表。

+2

什麼版本的SQL Server?非常感謝表格結構,樣本數據和期望的結果。 –

+0

2012,很高興你發現我的問題足夠。 – 007

+1

在很多問題上,這就像拉牙齒試圖獲得這些細節。我問版本只是爲了整理一下腳本。 –

回答

2

您不能在UPDATE列表中使用聚合(就像顯示的錯誤消息一樣)。

然而,你可以這樣來做:

;WITH x(C4,C5,C3Yes,C3No) AS 
(
    SELECT C4, C5, 
    COUNT(CASE WHEN C3 = 1 THEN 1 END), 
    COUNT(CASE WHEN C3 = 0 THEN 1 END) 
    FROM #Table2 GROUP BY C4, C5 
) 
UPDATE t1 SET Col3 = x.C3Yes, Col4 = x.C3No 
FROM #Table1 AS t1 
INNER JOIN x 
ON x.C4 = t1.Col1 AND x.C5 = t1.Col2; 
+0

啊,這是一個很好的解決方法。爲什麼你使用COUNT而不是SUM btw? – 007

+1

@ user1569220僅僅因爲用'COUNT()'你不必說'ELSE 0'。它只計算非'NULL'值,並且當所有其他條件都爲假並且省略'ELSE'時,'CASE'表達式的結果爲'NULL'。 –

+0

啊,我看到了NULL並回來張貼...只是爲了找到你已經回覆。一如既往,感謝你的幫助亞倫。 T/SQL AND/OR邏輯思維真的很棒。 – 007