[gull] Question SQL: créer des comparatif

B. Carrupt capt at digicapt.ch
Mon May 14 15:23:44 CEST 2007


Il me semble que tu attends beaucoup de SQL... La requête d'Amel me semble une bonne voie; maintenant, ce n'est plus qu'une question de présentation.

Je ne suis pas expert SQL, mais je sais que transformer des lignes en colonnes (les noms des commerces en l'occurrence) n'est pas une mince affaire.

Si le nombre de commerces est connu et pas trop grand, j'opterais pour une solution très peu propre (mais à partir du moment où tu veux faire de la présentation avec SQL...) : une table temporaire avec pour chaque colonne le nom du commerce, ainsi que l'id de l'article. D'une manière ou l'autre, tu dois pouvoir la générer à partir d'un SELECT sur la table des commerces.

Ca te donnerait une table du genre
commerce_temp
  marchandise_id int not null
  coop money null,
  migros money null, ...

Que tu remplirais avec tous les articles avec quelque chose du genre
INSERT INTO commerce_temp
(marchandise_id)
SELECT marchandise_id
FROM marchandise;

A ce stade, il peut valoir la peine d'ajouter un index sur le marchandise_id (ou la créer en tant que clé primaire).

Ensuite de quoi tu mettrais les prix à jour pour chaque commerce :
UPDATE commerce_temp
SET coop = (SELECT S.Prix
 FROM   Sondage S,
 WHERE  S.Date IN (
         SELECT MAX(T.Date)
         FROM   Sondage T
         WHERE  S.Marchandise_id = T.Marchandise_id
           AND  S.commerce_id = <coop_id>
       )

Tu devrais pouvoir générer cette requête pour les <coop_id> et <migros_id> de la même manière que tu auras pu générer la table temporaire.

Pour l'affichage :
  SELECT * FROM commerce_temp;
avec une jointure sur les articles pour choper le nom.

Maintenant, si tu as 2'000 commerces, tu risques de toucher des limites telles que le nombre de champs dans une table.

Bonne chance...

Blaise


----- Message d'origine -----
De: Félix Hauri <felix at f-hauri.ch>
Date: Mon, 14 May 2007 13:25:08 +0200
Sujet: Re: [gull] Question SQL: créer des comparatif
À: "Groupe romand des Utilisateurs de Linux et Logiciels Libres (Liste  technique)" <gull at lists.alphanet.ch>

>On Sun, May 13, 2007 at 01:40:42PM +0200, Amel Kapetanovic wrote:
>> Salut,
>> 
>> Je m'y prendrais du genre (non testé, SQL2) :
>> 
>> SELECT S.Commerce, S.Prix
>> FROM   Sondage S
>> WHERE  S.Marchandise = Id_choisi AND
>>       S.Date IN (
>>         SELECT MAX(T.Date)
>>         FROM   Sondage T
>>         WHERE  S.Commerce    = T.Commerce AND
>>                S.Marchandise = T.Marchandise
>>       )
>> ;
>Hmm. oui, jusque là, j'étais arrivé;-)
>(ou par une table temporaire comme proposé par Martial)
>
>> 
>> Remarquons qu'on est ennuyé si il y a >1 date max par (Commerce, 
>> Marchandise) dans Sondage
>Cela ne risque pas: on ne va pas sonder deux fois le même magasin
>dans la même journée...
>
>(au pire en ajoutant ``ORDER BY Id DESC LIMIT 1'' avant
> la fermeture de parenthèse, voire en se basant sur Id qui
> est nécessairement unique et tant que ORDER by Id ne
> peut pas contredire ORDER by date... ;)
>
>En fait, j'aimerais arriver à préparer un truc du style:
>
>SELECT Marchandise.descr, Prix(Commerce_1,MAX(Date)),
>    Prix(Commerce_...,MAX(Date)), Prix(Commerce_n,MAX(Date))
>  FROM My database...
>  ... ORDER BY Marchandise.descr
>
>Pour obtenir qqch comme:
>``Comparaison en date du: $date
>  Marchandise       | Coop    | Migros  | Denner   | ...
>  ------------------+---------+---------+----------+--
>  Chocolat au lait  |    12.- |    12.- |     12.- |...
>  Mouton Rotschild  |   120.- |   120.- |    120.- |...
>  ...                                                     ''
>
>> Félix Hauri a écrit :
>> > ...
>> >J'aimerais réaliser une table temporaire, présentant de la sorte:
>> >
>> >- Comparaison:
>> >Marchandise Id(Marchandise)
>> >Commerce_1   Prix (Marchandise, Commerce_1, selon dernier sondage)
>> >Commerce_... Prix (Marchandise, Commerce_..., selon dernier sondage)
>> >Commerce_n   Prix (Marchandise, Commerce_n, selon dernier sondage)
>
>-- 
> Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch
>_______________________________________________
>gull mailing list
>gull at lists.alphanet.ch
>http://lists.alphanet.ch/mailman/listinfo/gull
>


--
B. Carrupt




More information about the gull mailing list