|
|
|
| Есть таблицы:
groups:
group_id, group_name
users:
user_id, user_group_id
Задача вывести список групп с количеством юзеров в каждой.
Проблема в том, что
SELECT group_name, COUNT(*) AS group_user_num
FROM groups, users
WHERE group_id = user_group_id
GROUP BY group_id
|
Не выводит групп в которых 0 юзеров. | |
|
|
|
|
|
|
|
для: stalk3r
(13.09.2007 в 21:07)
| |
SELECT g.group_id, MAX (g.group_name), COUNT (1)
FROM groups g, users s
WHERE g.group_id = s.user_group_id
GROUP BY g.group_id;
|
| |
|
|
|
|
|
|
|
для: stalk3r
(13.09.2007 в 21:07)
| |
SELECT g.group_name, COALESCE(r.cnt, 0) AS user_count
FROM groups AS g
LEFT JOIN (
SELECT user_group_id, COUNT(user_id) AS cnt
FROM users
GROUP BY group_id
) AS r ON g.group_id = r.user_group_id
ORDER BY g.group_name
|
| |
|
|
|
|
|
|
|
для: Trianon
(13.09.2007 в 22:38)
| | Trianon, ты ошибки в запросе на откуп кому-то даешь ? | |
|
|
|
|
|
|
|
для: oradev
(13.09.2007 в 22:44)
| | Конечно. | |
|
|
|
|
|
|
|
для: Trianon
(14.09.2007 в 09:04)
| | 1 запрос - не работает (иногда можно и проверять то, что пишешь, но все равно - спасибо)
2 запрос - не слишком ли он громоздкий, еще с подзапросом... | |
|
|
|
|
|
|
|
для: stalk3r
(15.09.2007 в 11:53)
| | ---> 1 запрос - не работает (иногда можно и проверять то, что пишешь, но все равно - спасибо)
Вот давайте и проверим на тестовых таблицах:
SQL> SELECT d.deptno, MAX (d.dname), COUNT (1)
2 FROM emp e, dept d
3 WHERE e.deptno = d.deptno
4 GROUP BY d.deptno;
DEPTNO MAX(D.DNAME) COUNT(1)
---------- -------------- ----------
10 ACCOUNTING 3
20 RESEARCH 3
30 SALES 6
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- --------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17.12.80 800 20
7499 ALLEN SALESMAN 7698 20.02.81 1600 300 30
7521 WARD SALESMAN 7698 22.02.81 1250 500 30
7566 JONES MANAGER 7839 02.04.81 2975 20
7654 MARTIN SALESMAN 7698 28.09.81 1250 1400 30
7698 BLAKE MANAGER 7839 01.05.81 2850 30
7782 CLARK MANAGER 7839 09.06.81 2450 10
7839 KING PRESIDENT 17.11.81 5000 10
7844 TURNER SALESMAN 7698 08.09.81 1500 0 30
7900 JAMES CLERK 7698 03.12.81 950 30
7902 FORD ANALYST 7566 03.12.81 3000 20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- -------------------- --------- ---------- -------- ---------- ---------- ----------
7934 MILLER CLERK 7782 23.01.82 1300 10
12 строк выбрано.
SQL> select * from dept;
DEPTNO DNAME LOC
---------- -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
50 PROGRAMMING
|
| |
|
|
|
|
|
|
|
для: stalk3r
(13.09.2007 в 21:07)
| | Прошу прощения, работает.
Но не так, как надо. Опять не учитывает те группы, в которых 0 юзеров. А нужно, чтобы были и они.
2 запрос работает, спасибо. | |
|
|
|
|
|
|
|
для: stalk3r
(17.09.2007 в 20:58)
| | Ну а самому не переделать так как нужно ?
SELECT d.deptno, MAX (d.dname) dept_name, COUNT (empno)
FROM dept d LEFT JOIN emp e ON d.deptno = e.deptno
GROUP BY d.deptno
ORDER BY dept_name;
|
| |
|
|
|
|
|
|
|
для: oradev
(17.09.2007 в 21:22)
| | О, вот это дело. Всем спасибо - все свободны=))) | |
|
|
|