Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

[SQL] comparaison Résultat

Passarinho44, le jeudi 24 juillet 2008 à 15:28:08
Bonjour,

Je travaille en SQL et je précise que je ne peux pas utiliser autre chose.

En fait mon problème est que je retourne un résultat du type :

ID secondaire | Commentaire
1 | Commentaire1
1 | Commentaire2
1 | Commentaire3
2 | Commentaire1
... | ...

Et je voudrais faire une requête qui me permettrait de comparer le résultat de l'ID secondaire avec le suivant (ici d'abord 1 avec 1, puis 1 avec 1, puis 1 avec 2 ... etc... )

Et n'afficher un résultat que lorsque les deux sont différents

(Donc en clair ça doit m'afficher le dernier commentaire de chaque ID secondaire.

Je sais pas si c'est très clair... ^^"

Demandez moi si vous voulez plus de précisions.

Merci d'avance pour vos réponses =)
Répondre à Passarinho44  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 15:30:45
J'ai rien compris XD "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le jeudi 24 juillet 2008 à 15:32:38
En clair j'ai des ID (ils peuvent être plusieurs fois les mêmes )...

Pour chaque ID j'ai plusieurs commentaires.

Et bien je veux afficher le dernier commentaire de chaqeu ID.

C'est plus clair?
Répondre à Passarinho44

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 15:36:28
Nettement plus clair. Mais donc toi tu voudrais que celui qui reste soit, pour ton ID 1, le commentaire 3 car c'est le dernier. C'est bien cela? Et si j'ai 5 commentaires pour le ID 2, tu voudrais que ce soit le 5ème? "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le jeudi 24 juillet 2008 à 15:37:35
Oui voilà c'est ça.

Il faut donc comparer l'ID avec le suivant, est-ce possible en SQL???
Répondre à Passarinho44

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 15:41:26
Il y a tellement de chose possible. Pas besoin de comparer le ID avec le suivant. Attend, je réfléchi parce que j'ai pas, sur le moment, l'idée constructive pour faire ça. "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 15:56:25
Si tu fais un truc du genre:

SELECT TOP 1 m.idsecondaire, m.commentaire FROM matable m
HAVING m.idsecondaire = (SELECT DISTINCT(m2.idsecondaire) FROM matable m2) xx
ORDER BY commentaire DESC


Essaie un truc du genre mais j'ai rien pour testé et ça fait un petit moment que j'ai pas fait de SQL. Si j'avais le logiciel ici, je pourrais te faire ça et fonctionnel en un rien de temps XD "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le jeudi 24 juillet 2008 à 16:09:44
L'idée est très bonne.

Je pense que ça devrait fonctionner mais le problème c'est que mon champ ID est en fait un champ text (il contient par exemple "cr:400019" ) et donc SQL ne veut pas utiliser le = pour la sous-requete

De quoi corser un peu la chose ;)
Répondre à Passarinho44

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 16:21:31
Ah! C'est bon à savoir (parce que comparer des 1 c'est pas mal plus facile c'est clair). "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le jeudi 24 juillet 2008 à 16:25:20
J'ai appliquer ce que tu m'a mis à mon cas, je l'ai bidouiller dans tout les sens ^^" ... Pas moyen de le faire fonctionner ..

Le fait que ce soit un champ texte au lieu d'un champ int me renvoie toujours une erreur ... :(

Donc soit je dis à mon patron de refaire la bdd pour mettre un int (je crois pas qu'il va apprécier ^^ ) soit je trouve un moyen de comparer des champs texte pour faire la sous-requête.

Tu as une idée?
Répondre à Passarinho44

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 16:42:34
J'y pense mais la clause HAVING ne fonctionne pas avec texte donc il faut trouver autre chose ;)
"Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le jeudi 24 juillet 2008 à 17:08:16
Mon champ call_req_id est toujours de la forme "cr:xxxxxx".

Je me demande donc si on peut pas avec SQL virer les "cr:" puis transformer le résultat en int.

Ou alors comparer le résultat au suivant (mais toujours le même problème en fait ... ^^ )
Répondre à Passarinho44

13


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 17:13:31
Toujours des numéros après les deux points? "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

14


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le jeudi 24 juillet 2008 à 17:14:44
Oui, toujours une suite de 6numéros.
Répondre à Passarinho44

15


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 17:16:25
Alors dans ce cas:

SELECT TOP 1 m.idsecondaire, m.commentaire FROM matable m
HAVING CONVERT(SUBSTR(m.idsecondaire,3,LEN(m.idsecondaire)) AS int) = (SELECT DISTINCT(CONVERT(SUBSTR(m2.idsecondaire,3,LEN(m2.idsecondair­e)) AS int)) FROM matable m2) xx
ORDER BY m.commentaire DESC
"Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

16


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le jeudi 24 juillet 2008 à 17:33:15
Je viens d'essayer les 2 que tu m'as proposé ... Toujours une erreur.

Par contre pour le dernier l'erreur est diférente : il me dit qu'il y a une erreur de syntaxe près de "," (je sais pas quel virgule par contre >< )

Voici comment je l'ai adapté, tu trouveras peut-être l'erreur :

SELECT TOP 1
t1.call_req_id,
t1.action_desc
FROM
Act_log AS "t1"
HAVING
CONVERT(SUBSTR(t1.call_req_id,3,LEN(t1.call_req_id)) AS int) = (SELECT
DISTINCT(CONVERT(SUBSTR(t2.call_req_id,3,LEN(t2.call_req_id)) AS int))
FROM
Act_log AS "t2") xx
ORDER BY t1.action_desc DESC
Répondre à Passarinho44

17


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 17:39:11
Le meilleur moyen de savoir c'est de commencer par exécuter celle là toute seule:

SELECT
DISTINCT(CONVERT(SUBSTR(t2.call_req_id,3,L­EN(t2.call_req_id­)) AS int))
FROM
Act_log AS "t2"

Voir si elle marche et si le résultat retourné est celui désiré. "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

18


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le jeudi 24 juillet 2008 à 17:58:09
J'ai testé cette requete :

SELECT
DISTINCT(CONVERT(SUBSTR(t2.call_req_id,3,Lenght(t2.call_req_­id)), integer))
FROM
Act_log AS "t2"

(je l'ai modifié selon la doc que j'ai pour le logiciel sur lequel je développe) mais toujours la même erreur.. :x

Je crois que je vais en parler avec mon patron lundi ... ^^
Répondre à Passarinho44

19


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 18:01:56
c'est un champ text ou varchar? "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

20


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le vendredi 25 juillet 2008 à 14:21:51
Ben en fait je sais pas trop ^^"

Je peux juste lancer des requêtes sur la base, j'y ai pas accès autrement donc pas moyen de savoir.

Mais j'ai trouvé la solution à mon problème.

En fait je sais pas trop pourquoi il acceptait pas la fonction SubStr dans mes requêtes SQL.

Mais cela fonctionne directement dans les formules du logiciel sur lequel je bosse.

Donc pour résouder mon problème je me suis servi de formules (pour pouvoir utiliser la fonction substr et également comparer l'id avec le suivant comme je voulais le faire au début en récupérant les résultats de la requête simple SELECT call_req_id ).
Puis je récupère le nombre de résultat de la requêtes et avec des formules et l'utilisation de la fonction FOR, je test chaque résultat pour savoir s'il est différent du suivant.
S'il l'est, j'affiche le commentaire.
Et j'affiche tous ces résultats dans un autre tableau.

Je pense pas que ça va servir à quelqu'un plus tard mais bon ^^

En tout cas j'ai finalement résolu mon soucis (maintenant j'en ai un autre mais là ça concerne le logiciel en lui-même donc je vais devoir me débrouiller ^^ )

Merci beaucoup X-Fan pour ton aide.


A bientôt
Répondre à Passarinho44

21


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le vendredi 25 juillet 2008 à 15:24:44
Ben on va dire que c'est pas une façon très économique de faire mais bon, si ça marche, tant mieux.

Si ton champ était un texte, ça expliquerait pourquoi le convert marchait pas (tu peux pas convertir un texte en int, il faut d'abord le convertir en varchar et ensuite en int). Et pour la fonction substr qui marche pas, ben t'as quoi que pour un SQL LOL? "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

22


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le vendredi 25 juillet 2008 à 17:32:06
Bon mon patron vient de me dire que j'ai pas le choix : il faut que je le fasse en SQL ^^

Du coup si tu peux j'ai encore besoin un peu de toi ^^

En fait j'ai trouvé un autre champs que je peux comparer et là c'est un champ texte mais où il y a que des nombres (oui je sais c'est bizarre mais bon j'y peux rien ^^ )

Comment je fais pour passer ce champs du text au varchar à l'integer?

Merci d'avance =)
Répondre à Passarinho44

23


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le vendredi 25 juillet 2008 à 17:34:14
Si ton champ idsecondaire est un text, alors on doit convertir ce champ en varchar puis le convertir ensuite en int (dans la requête).

Mais es-tu sûr que substr ne fonctionne pas? Parce que c'est bien dans le manuel msdn et je l'ai toujours utilisé sans problème. "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

25


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le vendredi 25 juillet 2008 à 17:45:49
Oui mais j'utilise un langage SQL propriétaire, il doit y avoir des points de divergence...

Comment je fais pour convertir du text au varchar à l'int?

Parce que dans le manuel du logiciel, il n'y a pas le varchar :s
Répondre à Passarinho44

26


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le vendredi 25 juillet 2008 à 18:31:07
Ben pour moi, du SQL, c'est du SQL. Tout ce qui peut changer, c'est si c'est plus ancien et tout. Est-ce que la fonction convert fonctionne?

Essaie une requête conne du genre:

SELECT CONVERT(idsecondaire as varchar(10)) FROM matable

Regarde si ça marche ou pas. Ce serait un début. "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le jeudi 24 juillet 2008 à 17:13:01
SELECT m.idsecondaire, m.commentaire FROM matable m
INNER JOIN (SELECT TOP 1 * FROM matable m2 ORDER BY commentaire DESC )xx
ON xx.idsecondaire = m.idsecondaire

J'ai franchement pas d'idées là tout de suite LOL. Faut que j'y pense mais bref. "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

24


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le vendredi 25 juillet 2008 à 17:36:34
SELECT TOP 1 m.idsecondaire, m.commentaire FROM matable m
HAVING CONVERT((CONVERT(SUBSTR(m.idsecondaire,3,LEN(m.idsecondaire)­) AS varchar(10))) AS int) = (SELECT DISTINCT(CONVERT((CONVERT(SUBSTR(m2.idsecondaire,3,LEN(m2.id­secondair­e)) AS varchar(10)) AS int))) FROM matable m2) xx
ORDER BY m.commentaire DESC


Un truc comme ça je suppose. "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

27


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le lundi 28 juillet 2008 à 10:00:12
Bonjour,

Je viens de tester la fonction convert et dans mon logiciel, elle ne fonctionne pas comme en SQL normal.

Pour convertir en integer je doit faire : Convert(int, t2.ref_num)

Comme ça, la conversion fonctionne mais par contre le reste non ^^

J'ai pû faire fonctionner la sous-requête mais là où il y a un problème c'est au niveau du :
Convert(int, t2.ref_num) = (SELECT DISTINCT Convert(int, t3.ref_num) 'Ref_Num_Test' FROM call_req AS "t3")

Comme il est dans un HAVING, je dois mettre t2.ref_num dans un GROUP BY avant.

Seulement le problème est que lorsque je met le t2.ref_num dans un GROUP BY, il me dit qu'il ne peut pas trier des champs text (il ne prend pas la conversion dans le GROUP BY ... )
Répondre à Passarinho44

28


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le lundi 28 juillet 2008 à 16:00:21
Tu peux mettre:
GROUP BY Convert(int, t3.ref_num)

Je ne pense pas que ce soit interdit. Mais sinon, est-ce que tu as pu faire marcher substring? "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

29


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le lundi 28 juillet 2008 à 16:18:37
Non, il ne substring ne fonctionne pas mais en fait je n'en ai pas besoin : j'utilise un autre champ qui ne comporte que des chiffres donc plus de problème de ce côté là.

Je n'ai même plus de problème pour la conversion en integer.

J'ai trouvé sur un autre forum une personne qui avait un problème un peu similaire.

En essayant d'adapter son code j'arrive à ça mais toujours quelques soucis : il me dit que la colonne ref_num est invalide.
Je ne sais pas trop utiliser l'inner join donc bon ... :s

SELECT
Convert(int, t2.ref_num) "Ref_Num",
t2.description
FROM
call_req "t2",
Act_log "t1"
INNER JOIN
(
SELECT
Max(t1.ref_num),
t2.id
FROM
Act_log "t1",
call_req "t2"
WHERE
t1.type = 'LOG'
AND t1.call_req_id = t2.persid
GROUP BY
t1.id
) As "DernierEnrs"
ON t1.id=DernierEnrs.id
AND t1.ref_num=DernierEnrs.ref_num
WHERE
t1.type = 'LOG'
AND t1.call_req_id = t2.persid
GROUP BY t2.id
Répondre à Passarinho44

30


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le lundi 28 juillet 2008 à 16:23:13
Sinon, en adaptant ce que tu m'a proposé pour qu'il n'y ait plus d'erreur j'arrive à ça :

SELECT
Convert(int, t2.ref_num) "Ref_Num",
t1.description
FROM
Act_log "t1",
call_req "t2"
WHERE
t1.type = 'LOG'
AND t1.call_req_id = t2.persid
AND t2.ref_num >= '105410'
AND t2.ref_num <= '105420'
AND Convert(int,t2.ref_num) IN
(SELECT DISTINCT Convert(int, t3.ref_num)
FROM
call_req "t3"
WHERE
t3.ref_num >= '105410'
AND t3.ref_num <= '105420'
GROUP BY Convert(int, t3.ref_num))
ORDER BY Convert(int, t2.ref_num)

Mais ça ne m'affiche pas ce que je veux...

Ca m'affiche les ID avec tous les commentaires pour chaque ID.
Répondre à Passarinho44

31


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le lundi 28 juillet 2008 à 16:26:32
INNER JOIN ne sert qu'à lier deux tables sur un champ commun. Tu n'es pas supposé de retirer de l'information avec cette clause. C'est la clause HAVING ou WHERE qui doit servir à sélectionner des enregistrements filtrés. "Can't we learn from history, why's it such a mystery?"
Répondre à X-Fan

32


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Passarinho44, le lundi 28 juillet 2008 à 16:36:57
D'accord, donc on oublie le INNER JOIN pour cette question.

Tu as une idée pour afficher seulement le dernier commentaire?

Parce que moi à part comparer la valeur du ref_num avec la valeur suivante je vois pas ..
Répondre à Passarinho44

33


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
X-Fan, le lundi 28 juillet 2008 à 16:52:41