2010-11-18 4 views
1

J'ai écrit cette requête et j'ai essayé de grouper aussi par "D" mais cela ne fonctionne pas. De l'aide??Instruction SQL - CASE avec fonction Group By

(select hr_id, max(delivery_dt)as maxd, 
    (CASE 
    WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO' 
    WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO' 
    WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO' 
    ELSE '> 133 MO' END) D 
from INDIVIDUAL_VE_TB 
where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200') 
Group by hr_id) 

j'ai obtenu ce résultat

HR    DATE    D 
2000001076  4/22/1994   > 133 MO 
2000004986  12/13/2004  7 - 78 MO 
2000003382  12/13/2003  7 - 78 MO 

c'est le regroupement par HR, je suis aussi en train de groupe par D, mais il ne fonctionne pas j'ai ajouté D au groupe par Groupe par hr_id, D

Toute aide serait géniale !!!

Merci d'avance

+0

Vous n'êtes pas regroupés par 'D':' Group by hr_id' – AndreKR

+0

Quel RDBMS utilisez-vous? –

Répondre

3

Vous pouvez essayer:

Select hr_id, max(maxd), D 
from 
    (select hr_id, max(delivery_dt)as maxd, 
     (CASE 
     WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO' 
     WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO' 
     WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO' 
     ELSE '> 133 MO' END) D 
    from INDIVIDUAL_VE_TB 
    where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200') 
    Group by hr_id) 
group by D, hr_id 
+0

Ne fonctionne toujours pas. Je reçois une erreur qui ne dit pas un groupe par expression. –

+1

Vous devez également grouper par hr_id. – VVS

+0

@VVS: Oui, je pense que vous avez raison. actualisé. – FrustratedWithFormsDesigner

0

Vous devez répéter toute l'affaire-déclaration du groupe. Vous ne pouvez pas utiliser l'alias pour cela.

Si vous utilisez SQL Server, vous pouvez créer un jeu de résultats nommé temporaire à l'aide de la clause WITH et grouper par là. Si ce n'est pas le cas, vous pouvez également créer une vue sans regroupement et regrouper cette vue dans la colonne correspondante.

Version 1 (copie & coller la colonne calculée):

select 
    hr_id, 
    max(delivery_dt)as maxd, 
    (CASE 
     WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO' 
     WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO' 
     WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO' 
     ELSE '> 133 MO' 
    END) D 
from 
    INDIVIDUAL_VE_TB 
where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200') 
group by 
    hr_id, 
    (CASE 
     WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO' 
     WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO' 
     WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO' 
     ELSE '> 133 MO' 
    END) 

Version 2 (AVEC clause):

with temporary(hr_id, maxd, D) 
{ 
    select 
     hr_id, 
     max(delivery_dt)as maxd, 
     (CASE 
      WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO' 
      WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO' 
      WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO' 
      ELSE '> 133 MO' 
     END) D 
    from 
     INDIVIDUAL_VE_TB 
    where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200') 
    group by 
     hr_id 
} 
select 
    hr_id, 
    MAX(maxd) maxd, 
    D 
from 
    temporary 
group by 
    hr_id, D 

Version 3 est simplement la version 2 en deux parties.

+0

J'ai essayé de le faire mais cela n'a pas fonctionné –

+0

Maintenant, il est dit que la fonction de groupe n'est pas autorisée ici. J'utilise PL/SQL en passant par THX !!! –

0

Déplacez-le vers une jointure afin d'avoir une expression groupable.

select hr_id, max(delivery_dt)as maxd, i.D 
from 
    INDIVIDUAL_VE_TB IV1 
    join (
    select 
     CASE 
     IV2._YOUR_PK_HERE_ PK 
     WHEN max(delivery_dt) > '11-may-2010' then '< 6 MO' 
     WHEN max(delivery_dt) > '11-may-2004' and max(delivery_dt) < '11-may-2010' then '7 - 78 MO' 
     WHEN max(delivery_dt) > '11-nov-1999' and max(delivery_dt) < '11-april-2004' then '79 - 132 MO' 
     ELSE '> 133 MO' as D 
     END 
    from 
     INVDIVIDUAL_VE_TB IV2 
) i on i.PK=IV1.PK 

where hr_id in (select distinct hr_id from MODEL_SC_TB b where b.model_id='200') 
Group by hr_id, I.D 
0

avg, sum, max et count fonctions ne sont pas autorisés dans la clause group by, quel que soit ce que d'autres fonctions qu'ils sont à l'intérieur (dans ce cas CASE).

champs dans la liste Try GROUP BY que vous utilisez dans CASE état après WHEN, dans ce cas - delivery_dt.

0

L'ordre dans lequel les instructions SQL sont traitées est la clé ici:

  • FROM
  • WHERE
  • GROUP BY
  • HAVING
  • SELECT
  • DISTINCT
  • UNION
  • EXCEPT
  • INTERSECT
  • ORDER BY

Notez que GROUP BY est traité avant SELECT. Par conséquent, vous ne pouvez pas utiliser un alias de la cause SELECT - le moteur SQL ne le saura pas à ce stade. C'est aussi pourquoi les autres réponses qui ont suggéré de le déplacer dans un sous-select dans la clause FROM sont correctes. Si c'est fait dans le FROM, il sera disponible au moment où vous arriverez au GROUP BY.