Création d'une requête SQL

Création d'une requête SQL - SQL/NoSQL - Programmation

Marsh Posté le 09-11-2010 à 08:56:15    

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.

Reply

Marsh Posté le 09-11-2010 à 08:56:15   

Reply

Marsh Posté le 09-11-2010 à 09:34:10    

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
Reply

Marsh Posté le 09-11-2010 à 09:41:57    

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

Reply

Marsh Posté le 09-11-2010 à 09:43:29    

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
Reply

Marsh Posté le 09-11-2010 à 09:52:16    

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é.

Reply

Marsh Posté le 09-11-2010 à 13:50:59    

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
Reply

Marsh Posté le 09-11-2010 à 14:17:42    

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
 

Reply

Marsh Posté le 09-11-2010 à 14:35:37    

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

Reply

Sujets relatifs:

Leave a Replay

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