OVH Cloud OVH Cloud

Analyse croisée dynamique

3 réponses
Avatar
Denis
Bonjour,

Je recherche comment, dans une procédure stockée, créer une requete
d'analyse croisée qui se construit dynamiquement.

J'ai une table A


ID_SITE LIBELLE
==========================
1 AAAAA
2 BBBBB
3 CCCCC


puis une table B


ID MOIS ANNEE ID_SITE NOMBRE
==============================================
1 1 2005 1 10
2 1 2005 3 20
3 2 2005 2 5
4 3 2005 3 54


Je souhaite obtenir ceci :


MOIS ANNEE AAAAA BBBBB CCCCC
=====================================
1 2005 10 20
2 2005 5
3 2005 54


Mon problème, c'est que ma table A est "vivante" ce qui signifie que ma
requête d'analyse croisée doit se contruire dynamiquement en fonction des
enregistrements contenus dans cette table A.

J'ai trouvé un lien dans un précedent post qui donne l'exemple suivant mais
dans ce cas, les colonnes sont codées en dur dans la requête :

SELECT ImageID,
MAX(CASE WHEN SVGProperty='Line0001' THEN SVGPropertyValue END) as
Line0001,
MAX(CASE WHEN SVGProperty='Line0002' THEN SVGPropertyValue END) as
Line0002,
MAX(CASE WHEN SVGProperty='Line0003' THEN SVGPropertyValue END) as
Line0003,
MAX(CASE WHEN SVGProperty='Line0004' THEN SVGPropertyValue END) as
Line0004,
MAX(CASE WHEN SVGProperty='Line0005' THEN SVGPropertyValue END) as
Line0005
FROM SVGProperties
WHERE ImageID IN(1,2,3,6)
GROUP BY ImageID

Quelqu'un a t-il une solution à m'apporter ?

Aloha, 2nis.

3 réponses

Avatar
Sylvain Lafontaine
Si votre table est vivante, la seule façon d'y parvenir est d'abord de
parcourir votre table une première fois pour connaître les valeurs des
colonnes à utiliser puis à le faire une deuxième fois pour calculer les
valeurs requises. Si nécessaire, vous devrez aussi utiliser une table
temporaire ou un lock si autrement la détermination des colonnes peut
changer entre les deux étapes.

En cherchant sur Google avec les mots-clef « report cross-tab sql », vous
devriez trouver plusieurs exemples.

Comme point de départ, je vous suggère:

http://www.sqlteam.com/item.asp?ItemID)55

http://www.umachandar.com/technical/SQL6x70Scripts/main.htm

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"Denis" wrote in message
news:
Bonjour,

Je recherche comment, dans une procédure stockée, créer une requete
d'analyse croisée qui se construit dynamiquement.

J'ai une table A


ID_SITE LIBELLE
========================= > 1 AAAAA
2 BBBBB
3 CCCCC


puis une table B


ID MOIS ANNEE ID_SITE NOMBRE
============================================= > 1 1 2005 1 10
2 1 2005 3 20
3 2 2005 2 5
4 3 2005 3 54


Je souhaite obtenir ceci :


MOIS ANNEE AAAAA BBBBB CCCCC
==================================== > 1 2005 10 20
2 2005 5
3 2005 54


Mon problème, c'est que ma table A est "vivante" ce qui signifie que ma
requête d'analyse croisée doit se contruire dynamiquement en fonction des
enregistrements contenus dans cette table A.

J'ai trouvé un lien dans un précedent post qui donne l'exemple suivant
mais
dans ce cas, les colonnes sont codées en dur dans la requête :

SELECT ImageID,
MAX(CASE WHEN SVGProperty='Line0001' THEN SVGPropertyValue END) as
Line0001,
MAX(CASE WHEN SVGProperty='Line0002' THEN SVGPropertyValue END) as
Line0002,
MAX(CASE WHEN SVGProperty='Line0003' THEN SVGPropertyValue END) as
Line0003,
MAX(CASE WHEN SVGProperty='Line0004' THEN SVGPropertyValue END) as
Line0004,
MAX(CASE WHEN SVGProperty='Line0005' THEN SVGPropertyValue END) as
Line0005
FROM SVGProperties
WHERE ImageID IN(1,2,3,6)
GROUP BY ImageID

Quelqu'un a t-il une solution à m'apporter ?

Aloha, 2nis.



Avatar
Denis
Merci pour ces pistes, je m'en vais les explorer.

2nis

"Sylvain Lafontaine" wrote:

Si votre table est vivante, la seule façon d'y parvenir est d'abord de
parcourir votre table une première fois pour connaître les valeurs des
colonnes à utiliser puis à le faire une deuxième fois pour calculer les
valeurs requises. Si nécessaire, vous devrez aussi utiliser une table
temporaire ou un lock si autrement la détermination des colonnes peut
changer entre les deux étapes.

En cherchant sur Google avec les mots-clef « report cross-tab sql », vous
devriez trouver plusieurs exemples.

Comme point de départ, je vous suggère:

http://www.sqlteam.com/item.asp?ItemID)55

http://www.umachandar.com/technical/SQL6x70Scripts/main.htm

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"Denis" wrote in message
news:
> Bonjour,
>
> Je recherche comment, dans une procédure stockée, créer une requete
> d'analyse croisée qui se construit dynamiquement.
>
> J'ai une table A
>
>
> ID_SITE LIBELLE
> ========================= > > 1 AAAAA
> 2 BBBBB
> 3 CCCCC
>
>
> puis une table B
>
>
> ID MOIS ANNEE ID_SITE NOMBRE
> ============================================= > > 1 1 2005 1 10
> 2 1 2005 3 20
> 3 2 2005 2 5
> 4 3 2005 3 54
>
>
> Je souhaite obtenir ceci :
>
>
> MOIS ANNEE AAAAA BBBBB CCCCC
> ==================================== > > 1 2005 10 20
> 2 2005 5
> 3 2005 54
>
>
> Mon problème, c'est que ma table A est "vivante" ce qui signifie que ma
> requête d'analyse croisée doit se contruire dynamiquement en fonction des
> enregistrements contenus dans cette table A.
>
> J'ai trouvé un lien dans un précedent post qui donne l'exemple suivant
> mais
> dans ce cas, les colonnes sont codées en dur dans la requête :
>
> SELECT ImageID,
> MAX(CASE WHEN SVGProperty='Line0001' THEN SVGPropertyValue END) as
> Line0001,
> MAX(CASE WHEN SVGProperty='Line0002' THEN SVGPropertyValue END) as
> Line0002,
> MAX(CASE WHEN SVGProperty='Line0003' THEN SVGPropertyValue END) as
> Line0003,
> MAX(CASE WHEN SVGProperty='Line0004' THEN SVGPropertyValue END) as
> Line0004,
> MAX(CASE WHEN SVGProperty='Line0005' THEN SVGPropertyValue END) as
> Line0005
> FROM SVGProperties
> WHERE ImageID IN(1,2,3,6)
> GROUP BY ImageID
>
> Quelqu'un a t-il une solution à m'apporter ?
>
> Aloha, 2nis.
>





Avatar
Denis
C'est exactement ce qu'il me fallait et cela fonctionne bien

Merci

"Sylvain Lafontaine" wrote:

Si votre table est vivante, la seule façon d'y parvenir est d'abord de
parcourir votre table une première fois pour connaître les valeurs des
colonnes à utiliser puis à le faire une deuxième fois pour calculer les
valeurs requises. Si nécessaire, vous devrez aussi utiliser une table
temporaire ou un lock si autrement la détermination des colonnes peut
changer entre les deux étapes.

En cherchant sur Google avec les mots-clef « report cross-tab sql », vous
devriez trouver plusieurs exemples.

Comme point de départ, je vous suggère:

http://www.sqlteam.com/item.asp?ItemID)55

http://www.umachandar.com/technical/SQL6x70Scripts/main.htm

--
Sylvain Lafontaine, ing.
MVP - Technologies Virtual-PC


"Denis" wrote in message
news:
> Bonjour,
>
> Je recherche comment, dans une procédure stockée, créer une requete
> d'analyse croisée qui se construit dynamiquement.
>
> J'ai une table A
>
>
> ID_SITE LIBELLE
> ========================= > > 1 AAAAA
> 2 BBBBB
> 3 CCCCC
>
>
> puis une table B
>
>
> ID MOIS ANNEE ID_SITE NOMBRE
> ============================================= > > 1 1 2005 1 10
> 2 1 2005 3 20
> 3 2 2005 2 5
> 4 3 2005 3 54
>
>
> Je souhaite obtenir ceci :
>
>
> MOIS ANNEE AAAAA BBBBB CCCCC
> ==================================== > > 1 2005 10 20
> 2 2005 5
> 3 2005 54
>
>
> Mon problème, c'est que ma table A est "vivante" ce qui signifie que ma
> requête d'analyse croisée doit se contruire dynamiquement en fonction des
> enregistrements contenus dans cette table A.
>
> J'ai trouvé un lien dans un précedent post qui donne l'exemple suivant
> mais
> dans ce cas, les colonnes sont codées en dur dans la requête :
>
> SELECT ImageID,
> MAX(CASE WHEN SVGProperty='Line0001' THEN SVGPropertyValue END) as
> Line0001,
> MAX(CASE WHEN SVGProperty='Line0002' THEN SVGPropertyValue END) as
> Line0002,
> MAX(CASE WHEN SVGProperty='Line0003' THEN SVGPropertyValue END) as
> Line0003,
> MAX(CASE WHEN SVGProperty='Line0004' THEN SVGPropertyValue END) as
> Line0004,
> MAX(CASE WHEN SVGProperty='Line0005' THEN SVGPropertyValue END) as
> Line0005
> FROM SVGProperties
> WHERE ImageID IN(1,2,3,6)
> GROUP BY ImageID
>
> Quelqu'un a t-il une solution à m'apporter ?
>
> Aloha, 2nis.
>