2016-08-23 4 views
2

У меня есть данные из нижеприведенного запроса, который выглядит как первая таблица ниже, здесь, если вы заметили, что результаты основаны на count desc. Я хочу отображать данные в форме второй таблицы, и у меня возникают проблемы с запросом. То есть, если pagetype - это детали, элементы, которые я хочу суммировать для этого идентификатора, и если pagetype - это отдельный элемент, я хочу оставить его в покое и упорядочить по всем подсчетам результатов desc. Первый запрос gist выглядит, как показано ниже, у меня есть много других вещей, но здесь есть упрощенная версия.Запрос на запрос Oracle запрос подсчета

SELECT id, title, count(id) as count_num , pagetype 
, ROW_NUMBER() OVER (ORDER BY count(id) desc) AS the_row 
FROM table1, table2 
where pagetype in ('details','items','single-item') 
and table1.id = table2.id 
AND ct.PAGE_VIEW_DT > sysdate - 90 
ORDER BY the_row 


ID    Title      Count  pagetype 
-------------------------------------------------------------- 
33969 TITLE ONE       523   details 
33969 TITLE ONE       494   items 
198068 TITLE THREE      400  single-item 
33968 TITLE TWO       395   details 
198068 TITLE THREE      391   items 
198068 TITLE THREE      333   items 
198068 TITLE THREE      281   details 
33969 TITLE ONE       280  single-item 
33968 TITLE TWO       270  single-item 


ID    Title      Count  pagetype 
-------------------------------------------------------------- 
33969 TITLE ONE      1017 details,items 
198068 TITLE THREE      1005 details,items 
198068 TITLE THREE      400 single-item 
33968 TITLE TWO       395 details 
33969 TITLE ONE       280 single-item 
33968 TITLE TWO       270 single-item 
+1

Итак, у вас есть декартово соединение между 'table1' и' table2', без условия соединения между ними? Это трудно поверить. (если вы это сделали, вы не получите результаты, которые вы показываете.) Вам не хватает условия, возможно, 'table1.id = table2.id'? Несмотря на это, всегда лучше использовать синтаксис SQL Standard; «синтаксис запятой» для объединений, который был изобретен Oracle до того, как был принят стандарт, настоятельно рекомендуется против самого Oracle за последние 20 лет. – mathguy

+0

Да, у меня отсутствовало условие ... – user747291

ответ

0

вы можете использовать двойной group by и оракул listagg и оракула decode функции, как это (этот запрос, основанный на вас данные из вашего запроса):

with a(ID,Title,Count,pagetype) as (
-- here your data from question 
select 33969, 'TITLE ONE', 523, 'details' from dual union all 
select 33969, 'TITLE ONE', 494, 'items' from dual union all 
select 198068, 'TITLE THREE', 400,'single-item' from dual union all 
select 33968, 'TITLE TWO', 395,'details' from dual union all 
select 198068, 'TITLE THREE', 391, 'items' from dual union all 
select 198068, 'TITLE THREE', 333,'items' from dual union all 
select 198068, 'TITLE THREE', 281,'details' from dual union all 
select 33969, 'TITLE ONE', 280,'single-item' from dual union all 
select 33968, 'TITLE TWO', 270,'single-item' from dual) 

select id, title, sum(scount) scount, listagg(pagetype,',') WITHIN group (order by pagetype) 
    from (
select id, title, sum(count) scount, pagetype 
    from a 
group by id, title, pagetype 
) 
group by id, title, decode(pagetype,'details','tosum','items','tosum',pagetype) 
order by scount desc 

Вывод этого запроса:

33969 TITLE ONE 1017 details,items 
198068 TITLE THREE 1005 details,items 
198068 TITLE THREE 400  single-item 
33968 TITLE TWO 395  details 
33969 TITLE ONE 280  single-item 
33968 TITLE TWO 270  single-item 

в вашем запросе он может выглядеть так

with a as (
SELECT id, title, count(id) as count_num , pagetype 
, ROW_NUMBER() OVER (ORDER BY count(id) desc) AS the_row 
FROM table1, table2 
where pagetype in ('details','items','single-item') 
AND ct.PAGE_VIEW_DT > sysdate - 90 
) 

select id, title, sum(scount) scount, listagg(pagetype,',') WITHIN group (order by pagetype) ptype 
    from (
select id, title, sum(count_num) scount, pagetype 
    from a 
group by id, title, pagetype 
) 
group by id, title, decode(pagetype,'details','tosum','items','tosum',pagetype) 
order by scount desc 

его двойной группироваться, потому что listagg concatinate в TITLE THREE повторяющихся строк, как 'details,items,items' вместо того, чтобы вы хотели 'details,items' вот почему i'am использование двойной group by

1

Рассмотрим: Условный агрегацию. Поскольку я добавил группу здесь, идентификатор, заголовок сохраняют отдельные вещи, и я изменил значение в pagetype, чтобы быть деталями, элементами, когда он сталкивается с деталями или элементами, тем самым позволяя группе работать. Я думаю, что вложенная замена также будет работать, позволяя группе работать по своему желанию.

SELECT id, title, count(id) as count_num 
    , case when pagetype in ('details','items') 
      then 'details,items' 
      else pagetype end as pagetype 
    -- , ROW_NUMBER() OVER (ORDER BY count(id) desc) AS the_row 
FROM table1, table2 
where pagetype in ('details','items','single-item') 
AND ct.PAGE_VIEW_DT > sysdate - 90 
GROUP BY ID, Title, case when pagetype in ('details','items') 
          then 'details,items' 
          else pagetype end 
ORDER BY --the_row 
     count(ID) DESC; 

--- Попытка два после повторного чтения и перечитывания вопрос ... Благодаря @ Анатолий Предеин для экономии с меня некоторое время заявление ...

with a(ID,Title,Count,pagetype) as (
-- here your data from question 
select 33969, 'TITLE ONE', 523, 'details' from dual union all 
select 33969, 'TITLE ONE', 494, 'items' from dual union all 
select 198068, 'TITLE THREE', 400,'single-item' from dual union all 
select 33968, 'TITLE TWO', 395,'details' from dual union all 
select 198068, 'TITLE THREE', 391, 'items' from dual union all 
select 198068, 'TITLE THREE', 333,'items' from dual union all 
select 198068, 'TITLE THREE', 281,'details' from dual union all 
select 33969, 'TITLE ONE', 280,'single-item' from dual union all 
select 33968, 'TITLE TWO', 270,'single-item' from dual), 
with a(ID,Title,Count,pagetype) as (
-- here your data from question 
select 33969, 'TITLE ONE', 523, 'details' from dual union all 
select 33969, 'TITLE ONE', 494, 'items' from dual union all 
select 198068, 'TITLE THREE', 400,'single-item' from dual union all 
select 33968, 'TITLE TWO', 395,'details' from dual union all 
select 198068, 'TITLE THREE', 391, 'items' from dual union all 
select 198068, 'TITLE THREE', 333,'items' from dual union all 
select 198068, 'TITLE THREE', 281,'details' from dual union all 
select 33969, 'TITLE ONE', 280,'single-item' from dual union all 
select 33968, 'TITLE TWO', 270,'single-item' from dual) 

Select ID, Title 
    , sum(count) 
    , case when pageType in ('details','items') then 'details,items' else pagetype end as PageType 
FROM a 
Group by ID, Title  , case when pageType in ('details','items') then 'details,items' else pagetype end 
order by sum(count) desc 

Eсть вероятно, более простой способ, с помощью условного aggregration на первоначальном запросе ...

что-то вроде

SELECT id 
    , title 
    , count(id) as count_num 
    , case when pagetype in ('details','items') 
      then 'details,items' 
      else pagetype end as pagetype, 
FROM table1 
INNER JOIN table2 
    on table1.id = table2.id 
WHERE pagetype in ('details','items','single-item') 
    AND ct.PAGE_VIEW_DT > sysdate - 90 
GROUP BY ID 
     , Title 
     , case when pagetype in ('details','items') 
       then 'details,items' 
       else pagetype end 
ORDER BY count(id) desc 

, но я не могу проверить его без исходных исходных данных, не указанных в вопросе. (и я не склонен к издевке!)

+0

xQbert, я попытался использовать ваш запрос, но я все еще получаю 2 строки для одного ID, как я должен обращаться к этому – user747291

+0

. Я думаю, что это вызвано номером строки. Можем ли мы удалить это и просто упорядочить по счету (ID) Desc? Обновлено добавлено '- комментарии, чтобы исключить the_row и добавленный счетчик (ID) Desc' – xQbert

+0

Нет, мне кажется, нам нужно добавить сумму идентификаторов для деталей и элементов pagetype, чтобы получить одну строку для идентификатора, и этого не происходит. – user747291

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