IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[SQL2K5] Requete sur des dates.


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut [SQL2K5] Requete sur des dates.
    Bonjour,

    Voila 2h que je me triture les méninges (pas dans le bon sens apparemment) avec une requètes SQL.

    J'ai une table Appel avec donc une liste d'appel ^^
    Pour chaque appel on a la date de l'appel, date du prochain appel et l'entité reliée a cet appel.

    Tout d'abord j'affiche simplement tous les derniers appels de chaque entité pour un utilisateur donnée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select entityID, max(dateAppel) 
    From Appel(NOLOCK)
    where utilisateurID = '14' 
    Group by entityID
     
    J'ai 73 résultats.
    J'aimerais ajouté dans le select la date du prochain appel correpondant a la ligne du dernier appel.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select entityID, max(dateAppel), dateProchainAppel 
    From Appel(NOLOCK)
    where utilisateurID = '14' 
    Group by entityID, dateProchainAppel
     
    Et la j'ai 240 résultat.
    En effet il ne m'affiche pas la date du prochain appel ou la date de l'appel et la plus récente mais toutes les lignes.

    Alors ensuite j'ai essayé des sous requète et plusieurs choses mais rien n'y fait je ne trouve pas al requete pour :

    afficher la date du prochain appel correspondant a l'appel le plus récent.

    Merci d'avance pour vos conseils !

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Essayez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    WITH
    	CTE_DERNIER_APPEL AS
    	(
    		SELECT entityID,
    				MAX(dateAppel) AS maxDateAppel
    		FROM dbo.Appel(NOLOCK)
    		WHERE utilisateurID = '14' 
    		GROUP BY entityID
    	)
    SELECT A.entityID,
    		CTE.maxDateAppel,
    		A.dateAppel AS dateProchainAppel
    FROM CTE_DERNIER_APPEL AS CTE
    JOIN dbo.Appel AS A
    	ON CTE.entityID = A.entityID
    	AND A.dateAppel > CTE.maxDateAppel
    @++

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    Merci je vois a peu près quel genre de requète il faut faire avec ton exemple malgré que celui ci ne corresponde pas au resultat souhaité.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Si jamais vous ne parvenez pas à trouver ce dont vous avez besoin, postez la structure de vos tables, si possible avec un jeu de données représentatif, et le résultat souhaité

    @++

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut

    Alors voila, je prend par exemple le cas de l'entité 53,
    avec dans l'ordre, entityID, dateAppel, dateProchainAppel, utilisateurID.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    53	2009-09-08 18:29:07.000	2009-09-11 00:00:00.000	14
    53	2009-09-17 08:57:36.000	2009-09-18 00:00:00.000	14
    53	2009-09-17 16:12:28.000	2009-10-20 00:00:00.000	14
    53	2009-09-29 11:12:47.000	2009-09-29 00:00:00.000	14
    53	2009-09-29 11:13:50.000	2009-10-02 00:00:00.000	14
    53	2009-10-02 15:49:47.000	2009-10-05 00:00:00.000	14
    La requete doit me retourner toute la ligne ou la dateAppel est la plus récente.

    si je fait sa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT entityID, max(dateAppel), utilisateurID
    FROM dbo.Appel(NOLOCK)
    WHERE utilisateurID = '14' 
    and entityID = '53'
    group by entityID, utilisateurID
    il me retourne bein la bonne ligne mais je n'ai pas la valeur de la date du prochain appel.

    Si je fait sa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT entityID, max(dateAppel), dateProchainAppel, utilisateurID
    		FROM dbo.Appel(NOLOCK)
    		WHERE utilisateurID = '14' 
    		and entityID = '53'
    		group by entityID, dateProchainAppel, utilisateurID
    il me retourne les 5 lignes.

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Alors ça devrait être cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    DECLARE @T TABLE
    (
    	entityID INT,
    	dateAppel DATETIME,
    	dateProchainAppel DATETIME,
    	userID INT
    )
     
    INSERT INTO @T VALUES (53, '20090908 18:29:07.000', '20090911 00:00:00.000', 14)
    INSERT INTO @T VALUES (53, '20090917 08:57:36.000',	'20090918 00:00:00.000', 14)
    INSERT INTO @T VALUES (53, '20090917 16:12:28.000',	'20091020 00:00:00.000', 14)
    INSERT INTO @T VALUES (53, '20090929 11:12:47.000',	'20090929 00:00:00.000', 14)
    INSERT INTO @T VALUES (53, '20090929 11:13:50.000',	'20091002 00:00:00.000', 14)
    INSERT INTO @T VALUES (53, '20091002 15:49:47.000',	'20091005 00:00:00.000', 14)
    --------------------------------------------------------------------------------
    INSERT INTO @T VALUES (53, '20090907 08:29:07.000', '20091004 00:00:00.000', 15)
    INSERT INTO @T VALUES (53, '20090916 18:57:36.000',	'20090917 00:00:00.000', 15)
    INSERT INTO @T VALUES (53, '20090916 06:12:28.000',	'20091019 00:00:00.000', 15)
    INSERT INTO @T VALUES (53, '20090928 01:12:47.000',	'20090928 00:00:00.000', 15)
    INSERT INTO @T VALUES (53, '20090928 01:13:50.000',	'20091001 00:00:00.000', 15)
    INSERT INTO @T VALUES (53, '20091001 05:49:47.000',	'20091003 00:00:00.000', 15)
     
    ;WITH
    	CTE_DERNIER_APPEL AS
    	(
    		SELECT entityID, userID, MAX(dateAppel) AS maxDateAppel
    		FROM @T
    		GROUP BY entityID, userID
    	)
    SELECT A.entityID,
    		A.userID,
    		CTE.maxDateAppel AS dateDernierAppel,
    		MAX(A.dateProchainAppel) AS dateProchainAppel
    FROM CTE_DERNIER_APPEL AS CTE
    JOIN @T AS A
    	ON CTE.entityID = A.entityID
    	AND CTE.userID = A.userID
    GROUP BY A.entityID, A.userID, CTE.maxDateAppel
    HAVING MAX(A.dateProchainAppel) >= CTE.maxDateAppel
    @++

  7. #7
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    Merci pour ton aide mais lorsque j'exécute cette requête
    j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    53	14	2009-10-02 15:49:47.000	2009-10-20 00:00:00.000
    53	15	2009-10-01 05:49:47.000	2009-10-19 00:00:00.000
    Or pour la premeire ligne je devrais trouver la date correspondante a cette ligne soit 20091005 00:00:00.000 pour 20091002 15:49:47.000.
    Mais ce n'est pas le cas

  8. #8
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    Par exemple si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select entityID, dateProchainAppel, dateAppel
    from Appel as A1
    Where dateAppel = (select max(dateAppel)
    from Appel 
    where utilisateurID = '14'
    and entityID = '53')
    J'obiens bien ce que je veux:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    53	2009-10-05 00:00:00.000	2009-10-02 15:49:47.000
    Le probleme, c'est que je le veux pour toutes les entités et pas seulement pour la 53. Et C'est la que sa coince...

    Sinon la solution serait de faire 2 requetes séparés dans mon programme?
    Une qui récupère toute les entités qui seront exécuté dans la 2eme requêtes?
    Le problème c'est que sa revient a faire une requete et du code très gourmand, sale etc.. ^^

    Voila j'espère que mes précision vous aiderons a m'aider.
    Merci

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    WITH Ordered (
     entityID
     , dateProchainAppel
     , dateAppel
     , Row
    )
    AS
    (
     select entityID, dateProchainAppel, dateAppel
     , row_number() over (partition by A1.utilisateurID order by dateAppel desc) as row
     from Appel as A1
    )
    
    select entityID, dateProchainAppel, dateAppel
    from Ordered 
    where row = 1
    and utilisateurID = '14'
    Ça marche ?
    Si oui, fais en une view pour te faciliter la vie.
    Most Valued Pas mvp

  10. #10
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    Merci,
    En effet cela pourrait être une solution mais ceci ne permet que de trouver le dernier appel toute entité confondu. Or je cherche pour chaque entité.

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Partitionnes comme bon te semble.
    Tu peux voir la partition comme ta façon de grouper les résultats et de retrouver le dernier appel au sein de ce groupe.
    Most Valued Pas mvp

  12. #12
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    je ne vois pas du tout comment faire

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    , row_number() over (partition by A1.utilisateurID order by dateAppel desc) as row
    = un tri par dateAppel pour chaque utilisateur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    , row_number() over (order by dateAppel desc) as row
    = un tri par dateAppel pour l'ensemble des tables
    Ce qui semble être ce que tu recherches (sinon, il va te falloir définir ton vocabulaire : entité, etc....)
    Most Valued Pas mvp

  14. #14
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 86
    Points : 48
    Points
    48
    Par défaut
    Voila ce que j'ai fait dans mon code pour que sa marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
            QSqlQuery query;
            query.exec("SELECT id, raisonSocial, nomUsuel FROM Client");
            while(query.next())
                {
                QSqlQuery query2;
                query2.exec("SELECT entityID, dateProchainAppel, dateAppel "
                            "FROM Appel "
                            "WHERE dateAppel = (SELECT max(dateAppel) "
                            "FROM Appel "
                            "WHERE utilisateurID = '" + id + "' "
                            "AND entityID = '" + query.value(0).toString() + "')");
                while(query2.next())
                {
                    raisonSocialItem = new QTableWidgetItem(query.value(1).toString(), 1);
                    nomUsuelItem = new QTableWidgetItem(query.value(2).toString(), 1);
                    int i = 0;
                    if (query2.value(1).toDate() <  dateDuJour2)
                    {         
                    nomUsuelItem->setTextColor("red");
                    raisonSocialItem->setTextColor("red");
                    this->accueilTableWidget->insertRow(i);
                    this->accueilTableWidget->setItem(i,0, raisonSocialItem);
                    this->accueilTableWidget->setItem(i,1, nomUsuelItem);  
                    }
                    if (query2.value(1).toDate() == dateDuJour2)
                    {
                    this->accueilTableWidget->insertRow(i);
                    this->accueilTableWidget->setItem(i,0, raisonSocialItem);
                    this->accueilTableWidget->setItem(i,1, nomUsuelItem);
                    }
                    i = i + 1;
                }
                }
    Ceci me permet d'afficher dans un tableau la liste des clients dont la date de prochaine appel du dernier appel entré est inférieur ou egal a la date du jour.

    Pour l'instant ça n'a pas l'ar de ramer puisque il ne doit yavoir qu'une centaine de clients pour le moment.
    Mais lorsque j'en aurais 5000 je pense que ce code ne sera plus valide....
    Donc voila le but serais de concatener mes 2 requètes en une seules...
    Merci en tout cas pour m'avoir aider.

Discussions similaires

  1. requete sql sur des dates
    Par dcaille dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/10/2009, 10h00
  2. requete sql sur des dates
    Par dcaille dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/10/2009, 16h52
  3. Tri d'une requete sur des dates
    Par arnaud036 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 14/05/2009, 23h26
  4. requete sur des dates
    Par nox75 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/05/2007, 11h04
  5. Réponses: 9
    Dernier message: 17/01/2004, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo