Search code examples
sqlsql-servert-sqlsql-merge

SQL - An aggregate may not appear in the set list of an UPDATE statement


Hello and good day to everyone. Could you help me correct this SQL sequence?

MERGE INTO table2 WITH (HOLDLOCK) AS target
USING
(
  SELECT column1,
         AccessDate,
         AccessCount,
         column4,
         column5, 
         column6, 
         column7, 
         column8
  FROM  table1
  GROUP BY column1, column4, column5, column6, column7, column8
) AS source
ON target.column1 = source.column1 AND
   target.column5 = source.column5 AND
   target.column6 = source.column6 AND
   target.column7 = source.column7 AND
   target.column8 = source.column8
WHEN MATCHED THEN 
UPDATE SET target.LastAccessDate = MAX(source.AccessDate),
   target.LastWeeklyAccessCount = (SELECT SUM(source.AccessCount))
WHEN NOT MATCHED BY TARGET THEN
   INSERT (column1, LastAccessDate, LastWeeklyAccessCount, column4, column5, column6, column7, column8)
    VALUES (source.column1, source.AccessDate, source.AccessCount, source.column4, source.column5, source.column6, source.column7, source.column8);

I'm getting an "aggregate may not appear in the set list of an UPDATE statement" error when I try to run it because of these two lines:

target.LastAccessDate = MAX(source.AccessDate),
target.LastWeeklyAccessCount = (SELECT SUM(source.AccessCount))

My code should update in target the AccessDate to be the max of AccessDates from in the group and the LastWeeklyAccessCount to be the sum of counts in the group.

When no matching records are found just insert. I've worked with SQL like 2 years ago but can't remember much so any help is aprreciated.


Solution

  • The error is because AccessDate,AccessCount in select column list of source statement not appear in group by list:

        MERGE INTO table2 WITH (HOLDLOCK) AS target
        USING
        (
          SELECT column1,
                 MAX(AccessDate) AS AccessDate,
                 SUM(AccessCount) AS AccessCount,
                 column4,
                 column5, 
                 column6, 
                 column7, 
                 column8
          FROM  table1
          GROUP BY column1, column4, column5, column6, column7, column8
        ) AS source
        ON target.column1 = source.column1 AND
           target.column5 = source.column5 AND
           target.column6 = source.column6 AND
           target.column7 = source.column7 AND
           target.column8 = source.column8
        WHEN MATCHED THEN 
        UPDATE SET target.LastAccessDate = source.AccessDate,
           target.LastWeeklyAccessCount = source.AccessCount
        WHEN NOT MATCHED BY TARGET THEN
           INSERT (column1, LastAccessDate, LastWeeklyAccessCount, column4, column5, column6, column7, column8)
            VALUES (source.column1, source.AccessDate, source.AccessCount, source.column4, source.column5, source.column6, source.column7, source.column8);