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

Langage SQL Discussion :

SUM d’une colonne TIME


Sujet :

Langage SQL

  1. #21
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    J'ai en effet oublié le WITH de la CTE en début de requete. J'ai corrigé dans mon post initial.

  2. #22
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2014
    Messages : 53
    Points : 29
    Points
    29
    Par défaut
    Ah, ce n'était que ça ! Désolé, j'aurais dû le voir mais n'étant pas un expert en SQL (bien que j'aurais voulu l'être), j'ignorais même l'existence du mot-clé WITH !

    J'ai essayé la commande et je ne trouve pas le même résultat que la première. J'obtiens 268167 (ce sont toujours des secondes, je suppose) au lieu de 456460 secondes (ma première requête pour le total de temps).
    Le ORDER BY ne doit-il pas plutôt s'appliquer à la date ?

    Par contre, la requête s'exécute instantanément, contrairement à la mienne qui dure environ 45 secondes.

  3. #23
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Tigrounet Voir le message
    je ne trouve pas le même résultat que la première.
    Laquelle ?

    Est-ce que la composante horaire de votre datetime est renseignée ? auquel cas il pourrait y avoir de nombreux exæquo, ce qui pourrait expliquer la différence dans le résultat



    vous pouvez aussi condenser l'écriture de la requete que j'ai proposée ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    WITH pa AS (
    	SELECT 
    			SUM(temps_en_sec) duree
    		,	MIN(date_et_heure) premierAppel
    		,	DENSE_RANK() OVER(ORDER BY  MIN(date_et_heure)) AS rang
    	FROM appels
    	GROUP BY numero_sortant
    )
    SELECT SUM(duree) 
    FROM pa
    WHERE rang > 3000

  4. #24
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2014
    Messages : 53
    Points : 29
    Points
    29
    Par défaut
    C'est de cette requête dont je parlais !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select sum(temps_en_sec) from Appels$ where not (numero_sortant in (select top 3000 numeros.diff_nums from
    	(select distinct numero_sortant as diff_nums from Appels$) as numeros order by date_et_heure));
    Oui, toutes les lignes ont le datetime renseigné avec les minutes et les secondes ! Dans le cas où il y aurait des doublons, il devrait normalement y en avoir très peu… Et avec la requête condensée, je tombe sur le même résultat (268167).

    Dans votre requête, vous utilisez la fonction DENSE_RANK() qui, je suppose, trie les données afin d'obtenir par rang, et dans le OVER(…) vous indiquez avec quoi trier. Cependant, à quoi sert la fonction MIN(…) ? J'ai vu que ça sert à récupérer la plus petite valeur, mais là, elle sert à indiquer à DENSE_RANK() où commencer ?

  5. #25
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Oui, mais cette requête contient une erreur :

    Vous faites un order by date_et_heure.
    Mais votre sous requete ne contient pas la colonne date_et_heure dans sa sélection. C'est donc la valeur de la colonne date_et_heure de la requete principale qui est prise en compte, ce qui n'a aucun sens, et ce qui fausse le résultat de vos calculs.

    Pour éviter ce genre de problème difficile a détecter (car en l’occurrence, vous n'avez pas d'erreur dans la requete qui s’exécute parfaitement), vous devriez systématiquement utiliser des alias, (surtout quand une requete contient plusieurs fois la même table).

    ainsi, si vous aviez écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    order by numeros.date_et_heure
    Vous auriez eu l'erreur :

    Nom de colonne non valide*: 'date_et_heure'.

  6. #26
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2014
    Messages : 53
    Points : 29
    Points
    29
    Par défaut
    Ah merci, en effet, je n'avais pas vu !! C'est exactement la requête qu'il me fallait !!

    Maintenant, si je veux trier en plus par type de numéro, est-ce comme ça que je devrai faire ? (Admettons que je ne veux que les 06 et les 07, et je rappelle que ma table des numéros ne contient pas le premier 0.)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WITH pa AS (
    	SELECT 
    			numero_sortant AS num -- Récupérons aussi les numéros
    		,	SUM(temps_en_sec) duree
    		,	MIN(date_et_heure) premierAppel
    		,	DENSE_RANK() OVER(ORDER BY  MIN(date_et_heure)) AS rang
    	FROM Appels$
    	GROUP BY numero_sortant
    )
    SELECT SUM(duree) 
    FROM pa
    WHERE rang > 3000 /* Il suffit juste d'ajouter le tri ici, si je comprends bien. */ AND (pa.num like '6%' or pa.num like '7%');
    Est-ce correct ??

  7. #27
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Tout dépend de ce que vous voulez faire exactement :

    Si vous voulez la somme des durées d'appel en ne prenant en compte que les numéros en 06 et 07 et sans prendre en compte les 3000 premiers numéros quels qu'il soient, alors oui, c'est bon

    Si vous voulez la somme des durées d'appel en ne prenant en compte que les numéros en 06 et 07 et sans prendre en compte les 3000 premiers qui sont en 06 ou 07, alors il faut remonter la condition de filtre dans la sous requete.

  8. #28
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Octobre 2014
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Octobre 2014
    Messages : 53
    Points : 29
    Points
    29
    Par défaut Merci !
    C'est exactement ça : la somme des durées d'appel en ne prenant en compte que les numéros en 06 et 07 et sans prendre en compte les 3000 premiers numéros quels qu'il soient.

    Merci pour votre précieuse aide, sans quoi je serai parti avec une requête et des résultats faux !! Et en bonus, j'ai une requête parfaitement standard.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/04/2008, 09h47
  2. Récupérer les « choix » d’une colonne de type choix.
    Par souldav dans le forum SharePoint
    Réponses: 5
    Dernier message: 28/03/2008, 18h59
  3. Réponses: 1
    Dernier message: 11/07/2007, 17h37
  4. Réponses: 3
    Dernier message: 02/07/2007, 18h25
  5. Réponses: 1
    Dernier message: 05/12/2006, 21h39

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