I am new in sql and I want to know how can I select avg from count this is how my code looks like
Select zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa, count(zwierzeta.klatka_id) as licz
from zwierzeta
join klatki
on zwierzeta.zwierze_id = klatki.klatka_id
having count(zwierzeta.klatka_id) >= 1
GROUP BY zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa
Now I want to select avg from count(zwierzeta.klatka_id).
I have tried this method
Select zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa, count(zwierzeta.klatka_id) as licz, avg(licz) as avg_number
from zwierzeta
join klatki
on zwierzeta.zwierze_id = klatki.klatka_id
having count(zwierzeta.klatka_id) >= 1
GROUP BY zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa
`
but it doesnt recognize "licz"
CodePudding user response:
SELECT zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa,
licz, avg(licz) as avg_number
FROM (
Select zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa,
count(zwierzeta.klatka_id) as licz
from zwierzeta
join klatki
on zwierzeta.zwierze_id = klatki.klatka_id
having count(zwierzeta.klatka_id) >= 1
GROUP BY zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa)
GROUP BY zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa,
licz
ORA-00904: "KLATKI"."NAZWA": invalid identifier any idea?
CodePudding user response:
You have do it in another query
SELECT zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa,
licz, avg(licz) as avg_number
FROM (
Select zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa,
count(zwierzeta.klatka_id) as licz
from zwierzeta, klatki
where zwierzeta.zwierze_id = klatki.klatka_id
having count(zwierzeta.klatka_id) >= 1
GROUP BY zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa)
GROUP BY zwierzeta.nazwa,zwierzeta.klatka_id,klatki.nazwa,
licz
CodePudding user response:
Use the AVG
analytic function around the COUNT
function. If you want an average over the entire result set then:
SELECT z.nazwa,
z.klatka_id,
k.nazwa,
COUNT(z.klatka_id) as licz,
AVG(COUNT(z.klatka_id)) OVER () as avg_number
FROM zwierzeta z
JOIN klatki k
ON (z.zwierze_id = k.klatka_id)
GROUP BY
z.nazwa,
z.klatka_id,
k.nazwa
HAVING COUNT(z.klatka_id) >= 1
If you want to average over sub-partitions of the result set then add a PARTITION BY
clause:
SELECT z.nazwa,
z.klatka_id,
k.nazwa,
COUNT(z.klatka_id) as licz,
AVG(COUNT(z.klatka_id)) OVER (PARTITION BY z.nazwa, z.klatka_id) as avg_number
FROM zwierzeta z
JOIN klatki k
ON (z.zwierze_id = k.klatka_id)
GROUP BY
z.nazwa,
z.klatka_id,
k.nazwa
HAVING COUNT(z.klatka_id) >= 1