Autor Zpráva
Fury
Profil *
Zdravím,

mám následující dva dotazy:
select 
    AVG(a.answer) average
from 
    answers a
left join 
    users u
        on u.id = a.user_id
where 
    u.role in (1,2)

select 
    AVG(a.answer) average
from 
    answers a
left join 
    users u
        on u.id = a.user_id
where 
    u.role in (3,4)

A hledám cestu, zda se dají tyto dva dotazy sjednotit do jednoho a dělat rozdíl mezi AVG u uživatele s role (1,2) a u uživatele s role (3,4).

Zkoušel jsem upravit select, kde jsem dal:

AVG(IF(u.role = 3 or u.role = 4, a.answer, ''))

Ale to bohužel vracelo jiný průměr.

Dá se to řešit pouze jedním dotazem?

Díky moc!
TomášK.
Profil *
To je jen o vhodném přeskládání čísel, ne? Něco jako SUM(IF(u.role IN (1,2), a.answer, 0)) / SUM(u.role IN(1,2)) - SUM(IF(u.role IN (3,4), a.answer, 0)) / SUM(u.role IN(3,4)). Dva dotazy jsou o něco přehlednější, stačí INNER JOIN.
Kajman
Profil
SELECT (SELECT Avg(a.answer) average
        FROM   answers a
               JOIN users u
                 ON u.id = a.user_id
        WHERE  u.role IN ( 1, 2 ))
        -
        (SELECT Avg(a.answer) average
         FROM   answers a
                JOIN users u
                  ON u.id = a.user_id
         WHERE  u.role IN ( 3, 4 )) rozdil
Fury
Profil *
Super, díky za radu, akorát narazil jsem tam ještě na jednu věc, pokud bych dotaz upravil, že bych výsledky groupoval dle type_id, tzn. že dotaz by vypadal:

SELECT Avg(a.answer) average
        FROM   answers a
               JOIN users u
                 ON u.id = a.user_id
        WHERE  u.role IN ( 1, 2 ))
        GROUP BY a.type_id

Výsledky by tedy byly např:
type_id      average
1             2,3847
2             2,9583
3             2,4758

A já bych chtěl mít rozdíly mezi všemi type_id u u.role IN ( 1, 2 ) vs u.role IN ( 3, 4 ). Dá se i toto udělat dotazem do DB, nebo to už spíše řešit na úrovni PHP?

Díky
tttt
Profil *
SELECT 
  types.id,
  t1.average - t2.average AS diff
FROM
  types
  JOIN (
    SELECT
      AVG(a.answer) average
    FROM  
      answers a
      JOIN users u ON u.id = a.user_id
    WHERE  u.role IN ( 1, 2 )
    GROUP BY 
  ) t1 ON types.id = t1.type_id
  JOIN (
    SELECT
      AVG(a.answer) average
    FROM  
      answers a
      JOIN users u ON u.id = a.user_id
    WHERE  u.role IN ( 3, 4 )
    GROUP BY 
  ) t2 ON types.id = t2.type_id

Vymysli si, jaké chceš JOINy a případně ošetři null v average.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: