Home > OS >  How to select avg from count in oracle sql?
How to select avg from count in oracle sql?

Time:11-25

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
  • Related