Thread: Window function SQL - can't quite figure it.

Window function SQL - can't quite figure it.

From
Pál Teleki
Date:
Hi all,:


I'm struggling to get to grips with Window functions (DDL and DML at
end of post).

I have the following query:

SELECT department,
       amount,
       salesmanager,
       -- DISTINCT(salesmanager),
       SUM(amount) OVER(PARTITION BY department, salesmanager) AS "Sum
by dept.",
       ROW_NUMBER() OVER() AS "row number",
       ROUND((amount/SUM(amount) OVER(PARTITION BY department,
salesmanager)) * 100) AS "% of total"
FROM sales
-- GROUP BY department, salesmanager
ORDER BY department, salesmanager



which gives me back the following data:


department|amount|salesmanager|Sum by dept.|row number|% of total
Cars|100|James Wilson|100|1|100
Cars|300|Nick Hardy|300|2|100
Cars|170|Tom Sawyer|170|3|100
Computers|150|Eve Nicolas|420|4|36
Computers|270|Eve Nicolas|420|5|64
Computers|100|John Dale|100|6|100
Computers|70|Sam Dakota|170|7|41
Computers|100|Sam Dakota|170|8|59





CREATE TABLE sales
(
  saleid serial,
  department character varying(30),
  salesmanager character varying(30),
  subject character varying(100),
  amount numeric,
  CONSTRAINT sales_pkey PRIMARY KEY (saleid)
);


Re: Window function SQL - can't quite figure it.

From
"David G. Johnston"
Date:
On Sun, Jul 17, 2016 at 10:48 PM, Pál Teleki <ellenallhatatlan@gmail.com> wrote:
Hi all,:


I'm struggling to get to grips with Window functions (DDL and DML at
end of post).

​You never asked a question...

I suppose your actual problem is that

group_key,
sum(amount) over (...)
GROUP BY​
 
​group_key

Is giving you an error.  This is expected.  You must write that fragment

group_key,
sum(sum(amount)) over (...)
GROUP BY group_key

The window sum is not an aggregate from the perspective of group by.  In the original you never aggregated "amount" nor was it part of the group by and thus an error.  turning "amount" into the aggregate "sum(amount)" is one valid solution.

David J.