2014-02-17 5 views
0

Я новичок в Oracle SQL. Я попытался отобразить Имя билетов, количество закрытых и открытых билетов и дату. Но я не могу получить правильный запрос.Как сгруппировать данные внутри одного столбца?

Желаемый результат:

01/20/2014, User management, 20, 15 

Запрос:

SELECT 'Data' 
||','||TO_CHAR(D.DTIME_DAY,'MM/dd/yyyy') 
||','||q.name -- as ticket 
||','||NVL(o.CNT_OPENED,0) --as cnt_opened 
||','||NVL(c.CNT_CLOSED,0) --as cnt_closed 
FROM OWNER_DWH.DC_DATE d 
LEFT JOIN (
SELECT q.name, count(q.name), TRUNC(t.CREATE_TIME) as report_date, count(*) as cnt_opened 
FROM APP_ACCOUNT.OTRS_TICKET t 
left join app_account.otrs_queue q 
ON q.ID = t.QUEUE_ID 
WHERE t.CREATE_TIME BETWEEN SYSDATE -7 AND SYSDATE -1 
and t.queue_id not in (63, 61, 69, 59, 58, 60, 56, 64, 65, 23, 67, 68, 57) 
GROUP BY q.name, TRUNC(t.CREATE_TIME) 
) o ON d.DTIME_DAY=o.REPORT_DATE 
LEFT JOIN (
SELECT q.name, count(q.name), TRUNC(t.CLOSE_TIME) as report_date,count(*) AS cnt_closed 
FROM APP_ACCOUNT.OTRS_TICKET t 
left join app_account.otrs_queue q 
ON q.ID = t.QUEUE_ID 
WHERE t.CLOSE_TIME BETWEEN SYSDATE -7 AND SYSDATE -1 
and t.queue_id not in (63, 61, 69, 59, 58, 60, 56, 64, 65, 23, 67, 68, 57) 
GROUP BY q.name, TRUNC(t.CLOSE_TIME) 
) c ON D.DTIME_DAY=c.REPORT_DATE 
WHERE d.DTIME_DAY BETWEEN SYSDATE -7 AND TRUNC(SYSDATE) -1 
AND TRUNC(d.DTIME_DAY)= d.DTIME_DAY 
ORDER BY D.DTIME_DAY; 

И если я хочу, чтобы сгруппировать данные?

Пример: В одном столбце, скажем, у меня есть:

E-mail management 
E-mail management::Add user e-mail 
E-mail management::Add new Outlook distribution list 
E-mail management::Add new Outlook shared mailbox 
E-mail management::Add new SA e-mail (Zimbra account) 
POS::POS issue - need paper 
POS::POS issue - internet connection problems 

Все имя, которое имеет управление электронной почты будет группа, как управление электронной почты, и все, что имеет имя POS сгруппирует в качестве POS.

Желания выход:

02/10/2014, E-mail, 4 
    02/10/2014, POS, 2 

Как сделать это?

Пожалуйста, помогите мне. Заранее спасибо.

ответ

0

Вы можете сделать это следующим образом:

group by (case when col like 'E-mail management:%' then 'E-mail management' 
       when col like 'pos:%' then 'pos' 
       else col 
      end) 

агрегировать по части перед двоеточием:

group by substr(col, 1, instr(col, ':') - 1) 

или

group by (case when col like '%:%' then substr(col, 1, instr(col, ':') - 1) 
       else col 
      end) 

Конечно, вам придется исправить предложение select должно быть совместимо с пунктом group by.

EDIT:

Для подсчета количества в группах, вы могли бы сделать что-то вроде:

select (case when col like '%:%' then substr(col, 1, instr(col, ':') - 1) 
      else col 
     end), count(*) 
from table t 
group by (case when col like '%:%' then substr(col, 1, instr(col, ':') - 1) 
       else col 
      end) 
+0

как я могу отобразить саму дату? – user3317540

+0

Вы должны использовать функцию агрегации, такую ​​как 'min()' или 'list_agg()'. –

+0

как это сделать? – user3317540

Смежные вопросы