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 :

Somme + dates doubles


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 273
    Points : 73
    Points
    73
    Par défaut Somme + dates doubles
    Bonjour,

    je souhaite faire la somme de montants pour l'année en cours. Or j'ai parfois des dates en doubles (et le montant est en double aussi).

    Exemple: prenons une table "Chiffre-affaire":

    Nom : exemple.png
Affichages : 75
Taille : 2,7 Ko

    Ce que j'ai essayé:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SUM(montant), DISTINCT date
    FROM chiffre_affaire
    WHERE date LIKE '2016%'
    Or ça me compte encore la date du 4 janvier deux fois. Ce qui est logique car j'ai un ID différent pour les deux lignes. Mais du coup je ne vois pas comment faire :/

    Merci.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Bonjour,
    Dans votre exemple votre ligne en double a le même montant, mais Est-ce toujours le cas
    Comment déterminer en cas de doublon, la ligne à conserver ?

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 273
    Points : 73
    Points
    73
    Par défaut
    Bonne question, il faut que je liste uniquement les lignes a dates double maintenant. Mais là pareil je vois pas trop comment m'y prendre...

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    C'est simple, il suffit de virer la colonne ID avant d'utiliser DISTINCT

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT SUM(CA.montant), CA.date
    FROM (SELECT DISTINCT montant, date FROM chiffre_affaire) AS CA
    WHERE CA.date LIKE '2016%'
    GROUP BY CA.date
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 273
    Points : 73
    Points
    73
    Par défaut
    En effet! Merci beaucoup.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Benduroy Voir le message
    Ce que j'ai essayé:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SUM(montant), DISTINCT date
    FROM chiffre_affaire
    WHERE date LIKE '2016%'
    Vous ommettez de nombreuses erreurs dans cette requête...

    L'opérateur LIKE sur une date est une stupidité. En effet cet opérateur s'applique aux chaines de caractères et une date n'en est pas une.
    Si vous voulez filtrer sur une année précise vous devez utiliser la fonction normalisée EXTRACT ou la fonction correspondante sur le SGBDR avec lequel vous travaillez.

    DISTINCT est un opérateur de ligne et en aucun cas il ne peut s'appliquer à une colonne en particulier. Il doit en sus figurer juste après le mot clef SELECT. Notons qu'en général il est inutile lorsque l'on emploi une fonction d'agrégation ou la clause de groupement.

    En sus vous devez faire un groupement sur tous les éléments du SELECT ne figurant pas en tant qu'agrégat

    Enfin, nommer une colonne "date" est stupide car il s'agit d'un mot clef de SQL; Vous risquez d'avoir des problèmes dans certaines requêtes...

    Exemple :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT EXTRACT(year FROM date), (SUM(montant)
    FROM chiffre_affaire
    WHERE EXTRACT(year FROM date) = 2016

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Novembre 2010
    Messages
    273
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 273
    Points : 73
    Points
    73
    Par défaut
    Citation Envoyé par SQLpro Voir le message

    Enfin, nommer une colonne "date" est stupide car il s'agit d'un mot clef de SQL; Vous risquez d'avoir des problèmes dans certaines requêtes...
    Oui la colonne date sur laquelle je travaille ne s'appelle pas comme ça, mais même pour l'exemple j'aurais du appeler ça autrement.
    Merci pour le complément de réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Somme Date plus nombre
    Par malumiere dans le forum W4 Express
    Réponses: 4
    Dernier message: 21/01/2012, 09h36
  2. [Débutant] dictionnaire<date,double> avec C#?
    Par tallent_e dans le forum C#
    Réponses: 4
    Dernier message: 20/11/2011, 00h50
  3. [XL-2010] Somme date d'une textbox avec un nombre de jour
    Par justin74 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/07/2011, 21h46
  4. Somme date et nombre de jour
    Par tibogaet dans le forum VB.NET
    Réponses: 1
    Dernier message: 25/03/2010, 01h29
  5. probleme somme avec double conditions
    Par semas dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 04/09/2008, 16h45

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