[RESOLU] garder une seule ligne par valeur différente d'un champ

Petit nouveau ! | 8 Messages

19 janv. 2012, 15:41

Bonjour à tous,
Je débute totalement en SQL, et je recherche à ne garder qu'une ligne par champ CLE différent qui serait la date la plus récente.
J'ai donc ça :
CLE DATSTO STOCK
720230 31/01/2012 1523
888888 31/01/2012 173
720230 31/12/2011 1672
888888 31/12/2011 181
888888 31/12/2011 181
720230 31/12/2011 1667
888888 30/12/2011 181
888888 30/12/2011 181
720230 30/12/2011 1672
720230 30/12/2011 1686


Le résultat que je veux est ça :
CLE DATSTO STOCK
720230 31/01/2012 1523
888888 31/01/2012 173

ma requête d'origine est ça :
SELECT CLE,DATSTO,STOCK
FROM PUB.STOCKMOIS
ORDER BY DATSTO DESC

J'ai essayé des distinct, des max, des group by, mais sans succès.
Est-ce que quelqu'un peut m'aiguiller.
Merci d'avance.
zaggus.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

19 janv. 2012, 19:42

Tu peux nous donner un petit SQL de creation des tables et des donnees afin qu'on puisse tester ?

ViPHP
ViPHP | 2291 Messages

19 janv. 2012, 20:57

Salut,

Et un simple GROUP BY cle :?:
SELECT CLE,DATSTO,STOCK 
FROM PUB.STOCKMOIS
GROUP BY CLE
ORDER BY DATSTO DESC

ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Petit nouveau ! | 8 Messages

20 janv. 2012, 09:27

Salut,

Et un simple GROUP BY cle :?:
SELECT CLE,DATSTO,STOCK 
FROM PUB.STOCKMOIS
GROUP BY CLE
ORDER BY DATSTO DESC

Merci pour ta réponse, mais ça ne fonctionne pas. ça me renvoie l'erreur ''Il y a une expression 'Non-group-by' dans la clause select. ''
Pour corriger ça, je dois rajouter dans le GROUP BY tous les champ de mon SELECT et j'arrive au même résultat qu'au début.

ViPHP
ViPHP | 2291 Messages

20 janv. 2012, 10:20

:-k bizarre, alors il reste la solution de @ouckileou .
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

Petit nouveau ! | 8 Messages

20 janv. 2012, 15:43

Tu peux nous donner un petit SQL de creation des tables et des donnees afin qu'on puisse tester ?
je crois que oui. Est-ce que tu t'attends à ça :
insert into nomtable (cle,stock,datsto) values ('920230','69','40939');
insert into nomtable (cle,stock,datsto) values ('720230','1523','40939');
insert into nomtable (cle,stock,datsto) values ('888888','69134','40939');
insert into nomtable (cle,stock,datsto) values ('720230','1672','40908');
insert into nomtable (cle,stock,datsto) values ('888888','0','40908');
insert into nomtable (cle,stock,datsto) values ('720230','2','40908');
insert into nomtable (cle,stock,datsto) values ('720230','1667','40908');
insert into nomtable (cle,stock,datsto) values ('720230','0','40908');
insert into nomtable (cle,stock,datsto) values ('888888','0','40908');
insert into nomtable (cle,stock,datsto) values ('720230','1','40908');
insert into nomtable (cle,stock,datsto) values ('720230','1','40908');
insert into nomtable (cle,stock,datsto) values ('888888','0','40908');
insert into nomtable (cle,stock,datsto) values ('888888','0','40908');
insert into nomtable (cle,stock,datsto) values ('888888','15','40908');
insert into nomtable (cle,stock,datsto) values ('888888','25','40908');
insert into nomtable (cle,stock,datsto) values ('888888','1','40908');
insert into nomtable (cle,stock,datsto) values ('888888','1','40908');
insert into nomtable (cle,stock,datsto) values ('888888','87435','40908');
insert into nomtable (cle,stock,datsto) values ('888888','87454','40908');
insert into nomtable (cle,stock,datsto) values ('920230','74','40908');
insert into nomtable (cle,stock,datsto) values ('920230','74','40908');
insert into nomtable (cle,stock,datsto) values ('720230','1672','40907');
insert into nomtable (cle,stock,datsto) values ('888888','87454','40907');
insert into nomtable (cle,stock,datsto) values ('888888','87654','40907');
insert into nomtable (cle,stock,datsto) values ('720230','1686','40907');
insert into nomtable (cle,stock,datsto) values ('920230','74','40907');
insert into nomtable (cle,stock,datsto) values ('920230','74','40907');
insert into nomtable (cle,stock,datsto) values ('920230','75','40877');
insert into nomtable (cle,stock,datsto) values ('720230','1878','40877');
insert into nomtable (cle,stock,datsto) values ('888888','102490','40877');
insert into nomtable (cle,stock,datsto) values ('920230','89','40847');
insert into nomtable (cle,stock,datsto) values ('720230','2393','40847');
insert into nomtable (cle,stock,datsto) values ('888888','80583','40847');
insert into nomtable (cle,stock,datsto) values ('720230','2','40847');

Petit nouveau ! | 8 Messages

20 janv. 2012, 15:50

Arf...
Je n'ai pas fait attention, c'est ça le vrai insert :
insert into nomtable (cle,stock,datsto) values ('920230','69','31/01/2012');
insert into nomtable (cle,stock,datsto) values ('720230','1523','31/01/2012');
insert into nomtable (cle,stock,datsto) values ('888888','69134','31/01/2012');
insert into nomtable (cle,stock,datsto) values ('720230','1672','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','0','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('720230','2','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('720230','1667','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('720230','0','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','0','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('720230','1','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('720230','1','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','0','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','0','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','15','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','25','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','1','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','1','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','87435','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','87454','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('920230','74','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('920230','74','31/12/2011');
insert into nomtable (cle,stock,datsto) values ('720230','1672','30/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','87454','30/12/2011');
insert into nomtable (cle,stock,datsto) values ('888888','87654','30/12/2011');
insert into nomtable (cle,stock,datsto) values ('720230','1686','30/12/2011');
insert into nomtable (cle,stock,datsto) values ('920230','74','30/12/2011');
insert into nomtable (cle,stock,datsto) values ('920230','74','30/12/2011');
insert into nomtable (cle,stock,datsto) values ('920230','75','30/11/2011');
insert into nomtable (cle,stock,datsto) values ('720230','1878','30/11/2011');
insert into nomtable (cle,stock,datsto) values ('888888','102490','30/11/2011');
insert into nomtable (cle,stock,datsto) values ('920230','89','31/10/2011');
insert into nomtable (cle,stock,datsto) values ('720230','2393','31/10/2011');
insert into nomtable (cle,stock,datsto) values ('888888','80583','31/10/2011');
insert into nomtable (cle,stock,datsto) values ('720230','2','31/10/2011');

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

20 janv. 2012, 17:11

Le SQL pour creer la table aussi stp :)

Petit nouveau ! | 8 Messages

23 janv. 2012, 10:09

Le SQL pour creer la table aussi stp :)
Désolé,
ça, je ne maîtrise pas encore. Je vais voir ce que je peux faire.
Zag.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

23 janv. 2012, 11:05

salut,

demande a phpyadmin un export complet de la table en question.
par exemple dans une fenetre sql avec : desc nomtable;

@+
Il en faut peu pour être heureux ......

Petit nouveau ! | 6 Messages

23 janv. 2012, 12:55

Bonjour,

DDL de la table :

CREATE TABLE IF NOT EXISTS `nomtable` (
`cle` int(11) NOT NULL,
`stock` int(11) NOT NULL,
`datsto` date NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


Requête :

SELECT t1.cle AS cle , t1.stock as stock , t1.datsto as date FROM nomtable t1
WHERE datsto = (select max(t2.datsto) from nomtable t2 where t2.cle = t1.cle)

Résultat :

920230 69 2012-01-31
720230 1523 2012-01-31
888888 69134 2012-01-31

NB
Le format de la date dans les inserts n'est pas terrible du tout...

Bonne réception.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

25 janv. 2012, 18:47

Hello,

voici la requete qui fait ce que tu demandes:
mysql> SELECT n1.cle, n1.datsto, n1.stock
    -> FROM nomtable n1
    -> INNER JOIN (
    -> SELECT cle, max(stock) as stock
    -> FROM nomtable
    -> GROUP BY CLE) n2
    -> ON n1.cle = n2.cle and n1.stock = n2.stock;
+--------+------------+--------+
| cle    | datsto     | stock  |
+--------+------------+--------+
| 888888 | 2011-11-30 | 102490 |
| 920230 | 2011-10-31 |     89 |
| 720230 | 2011-10-31 |   2393 |
+--------+------------+--------+
3 rows in set (0.00 sec)
Effectivement, le format des dates n'est pas terrible du tout j'ai du tout modifier avant d'inserer ;)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

25 janv. 2012, 18:50

Ok donc deja je n'avais pas vu que tu avais poste la requete, et en plus j'etais reste sur l'idee que tu voulais le stock maximum... :oops:

Histoire que mon message ne soit pas completement inutile je dirais que a ta place j'utiliserais bien le mot-cle JOIN pour faire des jointures, plutot que les mettre dans les WHERE qui est pour le filtrage, c'est plus lisible ;)
mysql> SELECT n1.cle, n1.datsto, n1.stock
    -> FROM nomtable n1
    -> INNER JOIN (
    -> SELECT cle, max(datsto) as datsto
    -> FROM nomtable
    -> GROUP BY CLE) n2
    -> ON n1.cle = n2.cle and n1.datsto = n2.datsto;
+--------+------------+-------+
| cle    | datsto     | stock |
+--------+------------+-------+
| 920230 | 2012-01-31 |    69 |
| 720230 | 2012-01-31 |  1523 |
| 888888 | 2012-01-31 | 69134 |
+--------+------------+-------+
3 rows in set (0.00 sec)

Petit nouveau ! | 8 Messages

26 janv. 2012, 09:32

Milles mercis, ça marche.
Zag.