Je me demande si je peux effectuer un groupe par, et sélectionner un sous-ensemble différent de lignes pour chaque fonction agrégée. Exemple:
count(*) where order_price > 100 sum(*) where order_id < 200 avg(*) where other_condition
Je voudrais limiter les lignes utilisées par chaque fonction d'agrément en utilisant des conditions différentes, comme
select order, count(*), sum(*), avg(*) from table_orders group by order
Merci à tous!
3 Réponses :
Vous pouvez essayer ci-dessous - en utilisant cas lorsque expression
select order, count(case when order_price > 100 then order end), sum(case when order_id < 200 then order_price end), avg(case when other condition then order_price end) from table_orders group by order
Quelque chose comme celui-ci répondrait-il à votre recherche?
SQL> select e.deptno,
2 (select count(*)
3 from emp e1
4 where e1.job = 'SALESMAN'
5 and e1.deptno = e.deptno
6 ) v_count,
7 (select sum(e2.sal)
8 from emp e2
9 where e2.comm is not null
10 and e2.deptno = e.deptno
11 ) v_sum,
12 (select round(avg(e3.sal))
13 from emp e3
14 where e3.ename < 'KING'
15 and e3.deptno = e.deptno
16 ) v_avg
17 from emp e
18 group by e.deptno;
DEPTNO V_COUNT V_SUM V_AVG
---------- ---------- ---------- ----------
30 4 5600 1800
20 0 800 2358
10 0 2450
SQL>
Supposons que vous ayez la table ORDERS suivante:
select
count( gt500 )
, sum ( gt900 )
, avg ( lt300 )
from (
select
id
, case when order_price > 500 then 1 end gt500
, case when order_price > 900 then order_price end gt900
, case when order_price < 300 then order_price end lt300
from orders
)
;
-- result
COUNT(GT500) SUM(GT900) AVG(LT300)
7 3300 150
Utiliser CASE ... (comme @ fa06 l'a suggéré) vous donnera le résultat suivant - ce qui n'est probablement pas tout à fait ce que vous vouliez au départ:
--
-- eg
-- {1} count orders that have an order_price greater than 500
-- {2} find the sum of all orders that have an order_price greater than 900
-- {3} find the average value of orders that have an order_price < 300
--
select
id
, count( case when order_price > 500 then id end ) count_
, sum( case when order_price > 900 then order_price end ) sum_
, avg( case when order_price < 300 then order_price end ) avg_
from orders
group by id
;
-- result
ID COUNT_ SUM_ AVG_
1 0 NULL 100
6 1 NULL NULL
11 1 1100 NULL
2 0 NULL 200
4 0 NULL NULL
5 0 NULL NULL
8 1 NULL NULL
3 0 NULL NULL
7 1 NULL NULL
9 1 NULL NULL
10 1 1000 NULL
12 1 1200 NULL
12 rows selected.
Vous pouvez utiliser les CASE dans une vue en ligne et agréger son ensemble de résultats comme suit:
create table orders ( id, order_price ) as select level, level * 100 from dual connect by level <= 12 ; ID ORDER_PRICE 1 100 2 200 3 300 4 400 5 500 6 600 7 700 8 800 9 900 10 1000 11 1100 12 1200
Instruction de cas d'utilisation. J'espère que cela aidera.
il semblerait que vous recherchiez la HAVING , qui vous permet de filtrer les résultats résumés