2014-01-23 4 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 на основе соответствия между #Table1 и #Table2 по этому условию:UPDATE на основе Aggregation - T/SQL

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

И агрегатные T2.C3 значения для обновления значения для T1.Col3 и T1.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 

Это терпит неудачу с:

Msg 157, Level 15, State 1, Line 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

Ahh, это отличный обходной путь. Почему вы использовали COUNT вместо SUM btw? – 007

+1

@ user1569220 Просто потому, что с 'COUNT()' вам не нужно говорить 'ELSE 0'. Он уже учитывает значения, отличные от 'NULL', и когда все остальные условия являются ложными, и вы оставляете' ELSE', результат выражения 'CASE' равен' NULL'. –

+0

Ahh, я увидел NULL и вернулся к сообщению, что ... просто чтобы найти, что вы уже ответили. Как всегда, спасибо за вашу помощь Аарон. Вы действительно хороши с логикой T/SQL AND/OR. – 007

Смежные вопросы