Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
helixpoint
Constraint Violating Yak Guru
291 Posts |
Posted - 2015-01-27 : 13:17:57
|
I get this error:An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.On my where clause:WHERE ( ( t1.archived = 0 ) AND ( t1.recordnum LIKE 12345%' ) -- COALESCE(Sum(CASE WHEN t9.approvedest=1 THEN [t8].[ctrvalue] ELSE 0 END),0) + COALESCE(Sum(CASE WHEN t9.approvedest=1 THEN [t8].[govvalue] ELSE 0 END), 0) --AND (COALESCE(Sum(CASE WHEN t12.approvedest = 1 THEN [t11].[ctrvalue] ELSE 0 END),0) + COALESCE(Sum(CASE WHEN t12.approvedest = 1 THEN [t11].[govvalue] ELSE 0 END), 0) >1) AND ( COALESCE(CASE WHEN t12.approvedest = 1 THEN Sum([t11].[govvalue]) + Sum([t11].[ctrvalue]) ELSE 0 END, 0) >= 450 ) AND ( COALESCE(CASE WHEN t12.approvedest = 1 THEN Sum([t11].[govvalue]) + Sum([t11].[ctrvalue]) ELSE 0 END, 0) <= 2147483647 ) ) GROUP BY [t1].[id], [t1].[idnum], [t1].[recordtypeid], [t1].[title], [t3].[name], [t4].[name], t1.recordnum DaveHelixpoint Web Developmenthttp://www.helixpoint.com |
|
James K
Master Smack Fu Yak Hacker
3873 Posts |
Posted - 2015-01-27 : 13:47:26
|
Logically, WHERE clause is evaluated before the aggregations are performed, so you cannot use an aggregate function in the WHERE clause. HAVING clause is evaluated after the aggregations, so you can do the same thing in a HAVING clause - something like this:WHERE ( ( t1.archived = 0 ) AND ( t1.recordnum LIKE '12345%' ) -- COALESCE(Sum(CASE WHEN t9.approvedest=1 THEN [t8].[ctrvalue] ELSE 0 END),0) + COALESCE(Sum(CASE WHEN t9.approvedest=1 THEN [t8].[govvalue] ELSE 0 END), 0) --AND (COALESCE(Sum(CASE WHEN t12.approvedest = 1 THEN [t11].[ctrvalue] ELSE 0 END),0) + COALESCE(Sum(CASE WHEN t12.approvedest = 1 THEN [t11].[govvalue] ELSE 0 END), 0) >1) GROUP BY [t1].[id], [t1].[idnum], [t1].[recordtypeid], [t1].[title], [t3].[name], [t4].[name], t1.recordnumHAVING ( COALESCE(CASE WHEN t12.approvedest = 1 THEN Sum([t11].[govvalue]) + Sum([t11].[ctrvalue]) ELSE 0 END, 0) >= 450 ) AND ( COALESCE(CASE WHEN t12.approvedest = 1 THEN Sum([t11].[govvalue]) + Sum([t11].[ctrvalue]) ELSE 0 END, 0) <= 2147483647 ) ) |
|
|
ScottPletcher
Aged Yak Warrior
550 Posts |
Posted - 2015-01-27 : 17:25:43
|
Within the HAVING clause, I think you have to use a group function on all referenced columns:HAVING ( COALESCE(CASE WHEN MAX(t12.approvedest) = 1 THEN Sum([t11].[govvalue]) + Sum([t11].[ctrvalue]) ELSE 0 END, 0) >= 450 ) AND ( COALESCE(CASE WHEN MAX(t12.approvedest) = 1 THEN Sum([t11].[govvalue]) + Sum([t11].[ctrvalue]) ELSE 0 END, 0) <= 2147483647 ) ) |
|
|
|
|
|
|
|