Précédent   Forum des professionnels en informatique > Bases de données > DB2
DB2 Forum d'entraide technique sur la base de données DB2. Voir aussi -> Rubrique DB2
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/07/2007, 14h17   #1
Membre du Club
 
Inscription : mai 2005
Messages : 91
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 91
Points : 40
Points : 40
Par défaut [DB2 OS/390 7.1.1] SUBSTR dans un GROUP BY ?

Bonjour,

Je n'arrive pas à savoir si avec ma version de DB2, je peux faire une requête comme celle-là :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT
  Substr(T1.champ1, 1, 40),
  sum(T2.champ2)
FROM
  T1,
  T2
WHERE
  (T2.champ3=T1.champ4 )
  AND  ( T1.champ5= 'XU'  )
GROUP BY
   Substr(T1.champ1, 1, 40);
J'obtiens toujours l'erreur suivante :
SQL0104N Une marque inattendue "(" figure à la suite de "". Parmi les marques attendues, on trouve : "FOR WITH FETCH ORDER UNION EXCEPT QUERYNO OPTIMIZE ".
SQLSTATE=42601


Si vous pouvez me dire si c'est une erreur de syntaxe ou bien que sous DB2 on ne peut pas utiliser de SUBSTR dans un GROUP BY...

Je vous remercie par avance

Tux
tux2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/07/2007, 22h18   #2
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 098
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 098
Points : 1 707
Points : 1 707
Cette solution peut être :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT
  Substr(T1.champ1, 1, 40) AS souschamp1,
  sum(T2.champ2)
FROM
  T1,
  T2
WHERE
  (T2.champ3=T1.champ4 )
  AND  ( T1.champ5= 'XU'  )
GROUP BY
   souschamp1;
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2007, 09h36   #3
Membre du Club
 
Inscription : mai 2005
Messages : 91
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 91
Points : 40
Points : 40
Oui j'avais essayé mais dans ce cas j'obtiens cette erreur :
Code :
1
2
3
4
5
---------+---------+---------+---------+---------+---------+---------+---------+
 DSNT408I SQLCODE = -206, ERROR:  CHAMP1 IS NOT A COLUMN OF AN INSERTED TABLE,  
          UPDATED TABLE, OR ANY TABLE IDENTIFIED IN A FROM CLAUSE, OR IS NOT A  
          COLUMN OF THE TRIGGERING TABLE OF A TRIGGER                           
 DSNT418I SQLSTATE   = 42703 SQLSTATE RETURN CODE
Et j'obtiens la même erreur en faisant ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT
  Substr(T1.champ1, 1, 40) AS souschamp1,
  sum(T2.champ2) AS souschamp2
FROM
  T1,
  T2
WHERE
  (T2.champ3=T1.champ4 )
  AND  ( T1.champ5= 'XU'  )
GROUP BY
   souschamp1, souschamp2;

C'est pour cela que je me demandais si ce n'était pas lié à un pb de version de DB2 mais ça je n'arrive pas à trouver l'information...

J'ai également essayé une requête qui lui fait croire que ceux sont les champs d'une table mais cela n'a pas marché non plus.
tux2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2007, 14h53   #4
Membre du Club
 
Inscription : mai 2005
Messages : 91
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 91
Points : 40
Points : 40
Je viens d'avoir la confirmation par une collègue, les fonctions dans le GROUP BY ne sont pas acceptées avant la version 8i de DB2.

J'avais d'ailleurs trouvé la page IBM suivante : http://publib.boulder.ibm.com/infoce...sg/qch3sum.htm

avec un exemple :
Code :
1
2
3
4
5
6
7
Example: GROUP BY clause USING a expression: 
The following statement groups departments BY their LEADING characters, 
AND lists the lowest AND highest education level FOR each GROUP:
 
SELECT SUBSTR(WORKDEPT,1,1), MIN(EDLEVEL), MAX(EDLEVEL)
   FROM DSN8910.EMP
   GROUP BY SUBSTR(WORKDEPT,1,1);
mais c'était pour la version 9...

Donc avec ma version 7, il va falloir trouver une autre solution !!

Je vous remercie pour votre aide.
tux2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2007, 20h59   #5
Membre Expert

 
Homme François Durand
Spécialiste Delivery Mainframe IBM
Inscription : octobre 2005
Messages : 1 098
Détails du profil
Informations personnelles :
Nom : Homme François Durand
Âge : 53
Localisation : France, Seine Saint Denis (Île de France)

Informations professionnelles :
Activité : Spécialiste Delivery Mainframe IBM
Secteur : Finance

Informations forums :
Inscription : octobre 2005
Messages : 1 098
Points : 1 707
Points : 1 707
.. et ceci peut être :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT souschamp1,SUM(champ2) FROM
 ( SELECT 
   SUBSTR(T1.champ1, 1, 40) AS souschamp1,
   T2.champ2 AS champ2
   FROM
   T1,
   T2
   WHERE
   (T2.champ3=T1.champ4 )
    AND  ( T1.champ5= 'XU'  )
 ) AS temp
GROUP BY
souschamp1;
Luc Orient est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2008, 14h04   #6
Membre régulier
 
Inscription : janvier 2003
Messages : 255
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations forums :
Inscription : janvier 2003
Messages : 255
Points : 92
Points : 92
Envoyer un message via ICQ à Antichoc Envoyer un message via MSN à Antichoc
Six moi après, ce post est toujours utile !!

Je te confirme que sous DB2, cette requête fonctionne !

Merci
__________________
« Ne me faites pas d'objections.
Les difficultés en feront assez d'elles-mêmes. »

sir Winston Churchill
Antichoc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h52.


 
 
 
 
Partenaires

Hébergement Web