2016-08-23 1 views
2

J'ai les données de la requête ci-dessous qui ressemble à la première table ci-dessous, ici si vous observez les résultats sont basés sur le nombre desc. Je veux afficher les données sous la forme d'une deuxième table et j'ai des problèmes avec la requête. C'est si pagetype est des détails, des éléments que je veux additionner le compte pour cet ID, et si pagetype est singe-item je veux le laisser seul et ordonner par tous les résultats comptent desc. La première requête gist ressemble à ci-dessous, j'ai beaucoup d'autres choses, mais en voici une version simplifiée.requête Oracle sélectionner somme somme

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

Donc, vous avez une jointure cartésienne entre 'table1' et' table2', sans aucune condition de jointure entre eux? C'est difficile à croire. (Si vous le faisiez, vous n'obtiendriez pas les résultats que vous montrez.) Manquez-vous une condition, peut-être 'table1.id = table2.id'? Quoi qu'il en soit, il est toujours préférable d'utiliser la syntaxe de jointure SQL Standard; la "syntaxe de virgule" pour les jointures, qui a été inventée par Oracle avant l'adoption de la norme, est vivement déconseillée - par Oracle elle-même, depuis 20 ans. – mathguy

+0

Oui, il me manquait une condition ... – user747291

Répondre

0

vous pouvez utiliser le double group by et oracle listagg et oracle decode fonction comme ceci (cette requête basée sur vos données de votre recherche):

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 

résultat de cette requête:

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 

dans votre requête, il peut ressembler à ceci

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 

son double groupé car listagg concaténer en TITLE THREE les chaînes en double comme 'details,items,items' au lieu de vous vouliez 'details,items' c'est pourquoi i'am en utilisant le double group by

1

Considérez: l'agrégation conditionnelle. Depuis que j'ai ajouté un groupe par ici l'ID, le titre garde les choses séparées et j'ai changé la valeur dans le pagetype pour être des détails, des éléments quand il rencontre des détails ou des items, permettant ainsi à un groupe de fonctionner. Je pense qu'un remplacement imbriqué fonctionnerait aussi en permettant à un groupe de travailler comme désiré.

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; 

--- Tentative deux après relecture et relecture question ... Merci à @ Анатолий Предеин pour la déclaration avec un peu de temps me sauver ...

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 

Il y a probablement un moyen plus simple à l'aide aggregration conditionnelle à la requête initiale ...

quelque chose comme

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 

mais je suis incapable de le tester sans les données sources d'origine non fournies dans la question. (et je ne suis pas enclin à se moquer de certains!)

+0

xQbert, j'ai essayé d'utiliser votre requête, mais je reçois toujours 2 lignes pour le même ID comment dois-je adresser cela – user747291

+0

Je pense qu'il est casued par le numéro de ligne. Pouvons-nous supprimer cela et juste ordonner par compte (ID) Desc? Non ajouté, - commentaires pour exclure the_row et ajouté count (ID) Desc' – xQbert

+0

Non, je pense que nous devons ajouter la somme des ID pour les détails de pagetype et les éléments afin d'obtenir une ligne pour l'ID et ce n'est pas le cas. – user747291