2013-09-03 2 views
-2

Я хочу выход как:Показать работу, общее число сотрудников в рамках каждого задания из таблицы EMP

---------- 

job   count   ename 
---------- 
salesman  4   name1 
          name2 
          name3 
          name4 

clerk   4   name1 
          name2 
          name3 
          name4 
manager  3   name1 
          name2 
          name3 
analyst  2   name1 
          name2 
president  1   name 

....... и так далее.

Нельзя повторять название задания и подсчитывать каждое имя в этой задаче. У меня есть ответ с повторением.

+3

Пожалуйста, просмотрите [помощь] на **, как задать вопрос **. Покажите схему, образцы данных, ваш запрос и т. Д. –

+0

Вам нужно узнать о SQL JOINs. Googling для «SQL JOIN tutorial» должен дать вам множество ссылок. Оттуда попробуйте по вашему запросу, а затем мы можем вам помочь. –

ответ

0

SQL Fiddle

Oracle 11g R2 Настройка схемы:

CREATE TABLE employee 
    ("job" varchar2(9), "ename" varchar2(5)) 
; 

INSERT ALL 
    INTO employee ("job", "ename") 
     VALUES ('salesman', 'name1') 
    INTO employee ("job", "ename") 
     VALUES ('salesman', 'name4') 
    INTO employee ("job", "ename") 
     VALUES ('clerk', 'name1') 
    INTO employee ("job", "ename") 
     VALUES ('clerk', 'name2') 
    INTO employee ("job", "ename") 
     VALUES ('manager', 'name1') 
    INTO employee ("job", "ename") 
     VALUES ('manager', 'name2') 
    INTO employee ("job", "ename") 
     VALUES ('manager', 'name3') 
    INTO employee ("job", "ename") 
     VALUES ('salesman', 'name2') 
    INTO employee ("job", "ename") 
     VALUES ('salesman', 'name3') 
    INTO employee ("job", "ename") 
     VALUES ('clerk', 'name3') 
    INTO employee ("job", "ename") 
     VALUES ('president', 'name') 
    INTO employee ("job", "ename") 
     VALUES ('clerk', 'name4') 
    INTO employee ("job", "ename") 
     VALUES ('analyst', 'name1') 
    INTO employee ("job", "ename") 
     VALUES ('analyst', 'name2') 
SELECT * FROM dual 
; 

Запрос 1:

SELECT case when j."ename" = firstname then j."job" else ' ' end as job, 
     case when j."ename" = firstname then cast(c.cnt as varchar(5)) else ' ' end as "count", 
     j."ename" 
FROM employee j 
INNER JOIN (SELECT "job", min("ename") as firstname, count(*) as cnt FROM employee GROUP BY "job") c ON c."job" = j."job" 
ORDER BY cnt desc, j."job", j."ename" 

Results:

|  JOB | COUNT | ENAME | 
|-----------|-------|-------| 
|  clerk |  4 | name1 | 
|   |  | name2 | 
|   |  | name3 | 
|   |  | name4 | 
| salesman |  4 | name1 | 
|   |  | name2 | 
|   |  | name3 | 
|   |  | name4 | 
| manager |  3 | name1 | 
|   |  | name2 | 
|   |  | name3 | 
| analyst |  2 | name1 | 
|   |  | name2 | 
| president |  1 | name | 
+0

Я получил то же самое, но не ожидал после использования вашего решения. Я получил ошибку после использования двойных кавычек для ename, задание, поэтому я удалил его – shinek

+0

спасибо большое !!! – shinek