Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1618 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Création d'une requête SQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Création d'une requête SQL

n°2034865
jaguar75
Posté le 09-11-2010 à 08:56:15  profilanswer
 

Bonjour,
 
Je recherche de l'aide pour construire une requête SQL.
Voici ma table de départ
 
NUMSS    DEB         FIN        LIBEMPLOI
17807280 01/01/2010             ACHETEUR                        
17807280 01/07/2009  31/12/2009 ACHETEUR                        
17807280 01/01/2009  30/06/2009 RESP. LIBRE SERVICE              
17807280 01/11/2005  31/12/2008 ASSISTANT(E) TRANSPORT          
17807280 01/01/2004  31/10/2005 ASSISTANT(E) TRANSPORT          
17807280 01/04/2003  31/12/2003 ASSISTANT(E) TRANSPORT          
17807280 01/10/2001  31/03/2003 ACHETEUR                        
 
Voici le résultat que je souhaiterai obtenir
 
NUMSS    DEB         FIN        LIBEMPLOI
17807280 01/07/2009             ACHETEUR                
17807280 01/01/2009  30/06/2009 RESP. LIBRE SERVICE    
17807280 01/04/2003  31/12/2008 ASSISTANT(E) TRANSPORT  
17807280 01/10/2001  31/03/2003 ACHETEUR                
 
merci de votre aide.

mood
Publicité
Posté le 09-11-2010 à 08:56:15  profilanswer
 

n°2034877
esox_ch
Posté le 09-11-2010 à 09:34:10  profilanswer
 

Attends, tu veux obtenir uniquement les données en rouge?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°2034879
jaguar75
Posté le 09-11-2010 à 09:41:57  profilanswer
 

Non je veux obtenir tout le tableau, mais les données en rouge ceux sont les date de début de de fin de l'emploi.
- la date du 01/04/2003 vient de la 3ème ligne de ASSISTANT(E) TRANSPORT  
- la date du 31/12/2008 vient de la 1ère ligne de ASSISTANT(E) TRANSPORT  
c'est a dire date date de début et la date de fin de son activité ASSISTANT(E) TRANSPORT

n°2034880
esox_ch
Posté le 09-11-2010 à 09:43:29  profilanswer
 

D'accord je vois. T'en es où avec ta requête alors (histoire qu'on t'aide sans faire tout le boulot pour toi)


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°2034882
jaguar75
Posté le 09-11-2010 à 09:52:16  profilanswer
 

Malheureusement, je n'ai aucune idée, car si je fais un distinct, je vais n'avoir qu'un fois la fonction ACHETEUR, au lieu de 2. Sans le faite que la personne puisse refaire un ancien métier, cela aurait fonctionner tres bien; Mais là je suis bloqué.

n°2034961
Oliiii
Posté le 09-11-2010 à 13:50:59  profilanswer
 

Voila une solution en une seule query (sans stored proc):

Code :
  1. SELECT NUMSS,
  2.        MIN(DEB) DEB,
  3.        CASE WHEN MAX(isnull(FIN, '9999/12/31')) = '9999/12/31' THEN NULL ELSE MAX(isnull(FIN, '9999/12/31')) END FIN,
  4.        Libemploi
  5. FROM (
  6.     SELECT ROW_NUMBER() over (partition BY libemploi ORDER BY NUMSS, DEB DESC, libemploi) - ROW_NUMBER() over (ORDER BY NUMSS, DEB DESC, libemploi) a,
  7.            NUMSS,
  8.            DEB,
  9.            FIN,
  10.            Libemploi
  11.     FROM MyTable
  12.     ) a
  13. GROUP BY a.a, NUMSS, Libemploi
  14. ORDER BY a.a DESC


 
J'espere que ce n'est pas un exercice d'ecole sinon tu vas te faire avoir vu que c'est un chouilla capilotracté.
 
Le code complet que j'ai utilisé pour tester:

Code :
  1. Declare @tmpTable TABLE (NUMSS int, DEB datetime, FIN datetime, Libemploi varchar(50))
  2.  
  3. INSERT @tmpTable (NUMSS, DEB, FIN, Libemploi)
  4. VALUES (17807280, '2010/01/01', NULL, 'ACHETEUR'),
  5.        (17807280, '2009/07/01', '2009/12/31', 'ACHETEUR'),
  6.        (17807280, '2009/01/01', '2009/06/30', 'RESP. LIBRE SERVICE'),
  7.        (17807280, '2005/11/01', '2008/12/31', 'ASSISTANT(E) TRANSPORT'),
  8.        (17807280, '2004/01/01', '2005/10/31', 'ASSISTANT(E) TRANSPORT'),
  9.        (17807280, '2003/04/01', '2003/12/31', 'ASSISTANT(E) TRANSPORT'),
  10.        (17807280, '2001/10/01', '2003/03/31', 'ACHETEUR')
  11.  
  12.  
  13. SELECT NUMSS,
  14.        MIN(DEB) DEB,
  15.        CASE WHEN MAX(isnull(FIN, '9999/12/31')) = '9999/12/31' THEN NULL ELSE MAX(isnull(FIN, '9999/12/31')) END FIN,
  16.        Libemploi
  17. FROM (
  18.     SELECT ROW_NUMBER() over (partition BY libemploi ORDER BY NUMSS, DEB DESC, libemploi) - ROW_NUMBER() over (ORDER BY NUMSS, DEB DESC, libemploi) a,
  19.            NUMSS,
  20.            DEB,
  21.            FIN,
  22.            Libemploi
  23.     FROM @tmpTable
  24.     ) a
  25. GROUP BY a.a, NUMSS, Libemploi
  26. ORDER BY a.a DESC


 
Voila le resultat:

NUMSS       DEB                     FIN                     Libemploi
----------- ----------------------- ----------------------- ------------------------------
17807280    2009-07-01 00:00:00.000 NULL                    ACHETEUR
17807280    2009-01-01 00:00:00.000 2009-06-30 00:00:00.000 RESP. LIBRE SERVICE
17807280    2003-04-01 00:00:00.000 2008-12-31 00:00:00.000 ASSISTANT(E) TRANSPORT
17807280    2001-10-01 00:00:00.000 2003-03-31 00:00:00.000 ACHETEUR


Message édité par Oliiii le 09-11-2010 à 13:53:50
n°2034972
jaguar75
Posté le 09-11-2010 à 14:17:42  profilanswer
 

Génial,
merci Oliiii,
j'ai juste remplacé isnull par nvl, il connaissait pas la fonction isnull
et je connaissais pas partition by ni over
Merci
 

n°2034980
Oliiii
Posté le 09-11-2010 à 14:35:37  profilanswer
 

C'est testé pour SQL Server, mais les autres gros SGBD devraient avoir l'equivalent des fonctions.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Création d'une requête SQL

 

Sujets relatifs
Création d'un simple jeuCopier une base MySQL dans SQL Server 2008 [Resolu]
[SQL] Substring + Charindex/Patindexcreation de thumbnail
Création d'un configurateur 3d (ou pas)Appliquer deuxième tri à une requête sql
Script pour visualiser base de donnée SQL serverRequête sous Access, mode création ou SQL
Probleme de création de requête SQL un peu compliqué ![SQL] aide pour la création d une requete
Plus de sujets relatifs à : Création d'une requête SQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR