[SQL server] Problème de requête [--RESOLVED--]

Problème de requête [--RESOLVED--] [SQL server] - SQL/NoSQL - Programmation

Marsh Posté le 03-10-2003 à 16:27:06    

Une Table
 
Désignation  |   Date
-----------------------------
Dés 1        |  01/10/1990
Dés 2        |  02/02/1982
Dés 3        |  03/08/1999
Dés 4        |  15/12/1985
Dés 5        |  16/07/1992
Dés 6        |  17/05/1963
 
Et je veux récupérer la "Désignation" pour la plus vieille d'entres elles:
 
Si je fais
 
Select Max(Year(GetDate()) - Year(Date))
From Table

 
Je récupère l'age de la plus vieille, mais à partir du moment ou je veux afficher la "Désignation" correspondante, je m'emmêle les pinceaux.  :pt1cable:  
 
Select Désignation, (Year(GetDate()) - Year(Date)) As Age
From Table
Group By Désignation

 
Désormais s'affiche Toutes les "Désignation" et non plus uniquement la plus vieille  :heink:  
 
J'ai esseye des trucs du genre
 
Select Désignation
From Table
Where Year(GetDate()) - Year(Date) = Max(Year(GetDate()) - Year(Date))

 
mais il est vrai qu'on ne peut pas mettre d'aggregats dans un where alors j'ai tenté
 
Select Désignation
From Table
Group By Nom
Having Year(GetDate()) - Year(Date) = Max(Year(GetDate()) - Year(Date))

 
Mais là à nouveau je récupère toutes les lignes et non pas une seule. :cry:  
 
Une idée, une piste, un conseil, sont les bienvenu.
 :jap:  :jap:


Message édité par h4x0kz3r le 08-10-2003 à 11:59:26
Reply

Marsh Posté le 03-10-2003 à 16:27:06   

Reply

Marsh Posté le 03-10-2003 à 19:54:25    

Je vois pas pourquoi tu veux faire une soustraction avec la date courante :??:  
La plus ancienne, c'est celle qui a la date la plus "petite" (le min() de la colonne Date)

Reply

Marsh Posté le 04-10-2003 à 02:36:36    

Pour afficher l' "age", et pour calculer l'age il faut le calculer, mais sinon oui pour n'afficher que la "désignation" (min() ) suffit. Mais bon dans aucun des cas j'arrive à l'afficher, je bataille toujours avec la syntaxe.

Reply

Marsh Posté le 04-10-2003 à 10:12:10    

une solution bete :
 
 
select top 1 Désignation, (Year(GetDate()) - Year(Date)) As Age
From Table  
order by age desc
 
mais suppose qu'il n'y en a qu'une seule de plus ancienne
 
d'ou :
 
select blablabla from table where (Year(GetDate()) - Year(Date)) = (select max((Year(GetDate()) - Year(Date)) from Table)


Message édité par HappyHarry le 04-10-2003 à 13:44:32
Reply

Marsh Posté le 06-10-2003 à 18:01:18    

voila un liens vers un site ou sont expliquer pas mal de choses de manières assez simple... si sa peut t'aider !
  [:lofo]  
 
 
http://sqlpro.developpez.com/indexSQL.html

Reply

Marsh Posté le 07-10-2003 à 21:39:17    

Select Désignation
From Table
Where Year(GetDate()) - Year(Date) = Select(Max(Year(GetDate()) - Year(Date)))
 
Erreur au second Select
 
C'est quand même bizarre qu'on ne puisse pas afficher la Dés. correspondante à un calcul (aggregat)
 
Lofo merci du link =) je n'ai pas encore trouvé comment afficher ma dés mais je ne désespère pas!

Reply

Marsh Posté le 07-10-2003 à 22:53:17    

h4x0kz3r a écrit :

Select Désignation
From Table
Where Year(GetDate()) - Year(Date) = Select(Max(Year(GetDate()) - Year(Date)))
 
Erreur au second Select
 
C'est quand même bizarre qu'on ne puisse pas afficher la Dés. correspondante à un calcul (aggregat)
 
Lofo merci du link =) je n'ai pas encore trouvé comment afficher ma dés mais je ne désespère pas!
 


 
ca doit pas t'empecher de spécifier la table sur laquelle doit etre faite la requete imbriquée :sarcastic:


Message édité par HappyHarry le 07-10-2003 à 22:53:27
Reply

Marsh Posté le 07-10-2003 à 23:54:58    

clause HAVING

Reply

Marsh Posté le 07-10-2003 à 23:57:12    

select designation
from table
having date = min(date)


 
Ou plus simple (mais moins propre)
 

select top 1 designation
from table
order by date asc

Reply

Marsh Posté le 07-10-2003 à 23:58:49    

MagicBuzz a écrit :


 
Ou plus simple (mais moins propre)
 

select top 1 designation
from table
order by date asc




 
by date desc ;)
mais ca implique qu'il n'y a un qu'un seul enregistrement pour la date la plus récente, ca limite un peu
 
et pis grillaid pour celle la :o

Reply

Marsh Posté le 07-10-2003 à 23:58:49   

Reply

Marsh Posté le 08-10-2003 à 00:02:20    

bah nan, le desc va prendre la plus récente non :heink:
 
sinon, pas compris la seconde phrase :D
 
PS: de toute façon, le having est plus propre et plus académique

Reply

Marsh Posté le 08-10-2003 à 11:58:28    

Citation :

ca doit pas t'empecher de spécifier la table sur laquelle doit etre faite la requete imbriquée :sarcastic:


 
wooops  :whistle:  
 
Pour le  
 

Code :
  1. select designation
  2. from table
  3. having date = min(date)


 
'Table.Désignation' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
'Table.Date' is invalid in the HAVING clause because it is not contained in an aggregate function and there is no GROUP BY clause.
 
Et si je rajoute
 
Group By Désignation, Date
 
ça me renvoie à nouveau toutes le lignes
 
Mais bon avec la requete imbriqué ça marche impec, Merci beaucoup à tous :jap:  :jap:  

Reply

Marsh Posté le 08-12-2010 à 12:09:45    

il n'y a jamais de HAVING sans GROUP BY déjà (le having c'est le where du group by, sa retreint sur les groupes)
 
LA solution : Par exemple avec une de mes base voilà comment j'ai fait (la jointure est pas forcément obligatoire sa dépend des relations et tables) , je dois afficher l'avion le plus ancien de la compagnie Aero, donc pour toi c'est pareil sans la jointure :
 
SELECT numAvion  
FROM Avion JOIN Compagnie ON numCompAvion=numComp
WHERE dateMiseServiceAvion = (select MIN(dateMiseServiceAvion) from avion WHERE nomComp='Aero')


Message édité par Nco95 le 08-12-2010 à 13:29:24
Reply

Marsh Posté le 08-12-2010 à 15:27:35    

C'est moi ou y'a un déterrage de topic de la mort qui tue  :D  
Depuis tout ce temps je lui souhaite quand même d'avoir trouvé sa réponse  :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed