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 <[EMAIL PROTECTED]>
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)" <[email protected]>
>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 - <[EMAIL PROTECTED]> - http://www.f-hauri.ch
>_______________________________________________
>gull mailing list
>[email protected]
>http://lists.alphanet.ch/mailman/listinfo/gull
>
--
B. Carrupt
_______________________________________________
gull mailing list
[email protected]
http://lists.alphanet.ch/mailman/listinfo/gull