If you’re getting error number 4123 that reads “Window element in OVER clause can not also be specified in WINDOW clause” in SQL Server, it’s probably because you’re referring to a named window with the same clause that’s in the named window.
When we use the OVER clause to refer to a named window in SQL Server, we can’t include a clause that’s also present in the named window.
To fix the issue, remove one of the clauses – either the one in the OVER clause or the one in the named window.
Example of Error
Here’s an example of code that produces the error:
SELECT
District,
Name,
Population,
SUM(Population) OVER(win PARTITION BY District) AS "Population"
FROM City
WHERE CountryCode = 'AUS'
WINDOW win AS (PARTITION BY District);
Result:
Msg 4123, Level 15, State 2, Server bd79c358ea10, Line 69 Window element in OVER clause can not also be specified in WINDOW clause.
In this case, I used a PARTITION BY clause in both the OVER clause and the WINDOW clause (which defines the named window).
This is not allowed and so I got the error.
Solution
All I need to do to fix the problem is remove one of the PARTITION BY clauses:
SELECT
District,
Name,
Population,
SUM(Population) OVER win AS "Population"
FROM City
WHERE CountryCode = 'AUS'
WINDOW win AS (PARTITION BY District);
Result:
District Name Population Population -------------------- --------------- ----------- ----------- Capital Region Canberra 322723 322723 New South Wales Sydney 3276207 3993949 New South Wales Newcastle 270324 3993949 New South Wales Central Coast 227657 3993949 New South Wales Wollongong 219761 3993949 Queensland Brisbane 1291117 1805236 Queensland Gold Coast 311932 1805236 Queensland Townsville 109914 1805236 Queensland Cairns 92273 1805236 South Australia Adelaide 978100 978100 Tasmania Hobart 126118 126118 Victoria Geelong 125382 2990711 Victoria Melbourne 2865329 2990711 West Australia Perth 1096829 1096829
In this case I removed the PARTITION BY clause from the OVER clause in the SELECT list.
Note that I also removed the parentheses. If I hadn’t done this, I would’ve seen a different error.
An alternative fix would have been to remove the PARTITION BY clause from the WINDOW clause (while keeping the one in the OVER clause):
SELECT
District,
Name,
Population,
SUM(Population) OVER(win PARTITION BY District) AS "Population"
FROM City
WHERE CountryCode = 'AUS'
WINDOW win AS ();
Mind you, in this case I’m removing all clauses from the WINDOW function, which kind of defeats the purpose of even having a named window.