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

Développement SQL Server Discussion :

Requete qui renvoi 0 si il n'y a pas de données


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut Requete qui renvoi 0 si il n'y a pas de données
    Bonjour à tous,

    J'ai une table avec des données datées. ex:
    1 donnée1 31/08/2010
    2 donnee2 31/08/2010

    je voudrais faire une requête qui me retourne le nombre d'enregistrement par date, mais qui me retourne 0 si il n'y a pas d'enregistrement.
    ex:
    1 donnée1 31/08/2010
    2 donnee2 31/08/2010
    3 donnée3 02/09/2010
    4 donnee4 03/09/2010

    résultat:
    31/08/2010 2
    01/09/2010 0
    02/09/2010 1
    03/09/2010 1

    Pour le moment ma requête ressemble à cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select date, count(id) 
    from matable 
    group by date
    Merci d'avance pour votre aide.

  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 : 44
    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
    Par défaut
    Bonjour,

    Je considère que vous travaillez sous SQL Server 2005 ou 2008.
    Considérons la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE dbo.jubourbon
    (
    	valeur tinyint
    	, data varchar(16)
    	, date_valeur date
    )
    GO
     
    INSERT INTO dbo.jubourbon VALUES (1, 'donnée1', '20100831')
    INSERT INTO dbo.jubourbon VALUES (2, 'donnée2', '20100831')
    INSERT INTO dbo.jubourbon VALUES (3, 'donnée3', '20100902')
    INSERT INTO dbo.jubourbon VALUES (3, 'donnée4', '20100903')
    GO
    La requête dont vous avez besoin nécessite une expression de table commune récursive qui calcule toutes les dates de tous les jours compris entre la plus petite et la plus grande date de votre table.
    Il suffit ensuite de faire une demi-jointure, et on peut écrire :

    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
    ;WITH 
    	CTE AS
    	(
    			SELECT	MIN(date_valeur) AS min_date_valeur
    				, MAX(date_valeur) AS max_date_valeur
    			FROM	dbo.jubourbon
    		UNION ALL
    			SELECT	DATEADD(day, 1, min_date_valeur)
    				, max_date_valeur
    			FROM	CTE
    			WHERE	min_date_valeur < max_date_valeur
    	)
    SELECT		C.min_date_valeur AS date_valeur
    		, SUM
    		(
    			CASE
    				WHEN J.date_valeur IS NULL THEN 0
    				ELSE 1
    			END
    		) AS occurences
    FROM		CTE AS C
    LEFT JOIN	dbo.jubourbon AS J ON C.min_date_valeur = J.date_valeur
    GROUP BY	C.min_date_valeur
    Qui donne le résultat escompté

    @++

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Lourdingue nicolas !!!!!, voici plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE TABLE matable
    ("date" DATE,
     id     INT)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH 
    T AS (SELECT "date", count(id) AS N
          FROM   matable
          GROUP  BY "date")
    SELECT *
    FROM   T
    UNION ALL
    SELECT NULL, 0
    WHERE  NOT EXISTS(SELECT * FROM T)
    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/ * * * * *

  4. #4
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut
    Merci pour ta réponse, mais je n'obtiens pas tt a fait ce que je cherche.

    Citation Envoyé par SQLpro Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    WITH 
    T AS (SELECT "date", count(id) AS N
          FROM   matable
          GROUP  BY "date")
    SELECT *
    FROM   T
    UNION ALL
    SELECT NULL, 0
    WHERE  NOT EXISTS(SELECT * FROM T)
    Cette requête ne m'affiche pas le 01/09 avec la valeur 0, elle n'affiche que les date avec un enregistrement.

  5. #5
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut
    Je ne comprend pas le select null,0

  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 999
    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 999
    Billets dans le blog
    6
    Par défaut
    Commencez par respecter la charte de postage. Il est impossible de vous aider dans le vague.

    http://www.developpez.net/forums/d96...vement-poster/

    Postez le DDL et les INSERT de vos tables/exemples ainsi que la réponse demandée.

    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 éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut
    Merci pour cette super réponse,

    Cependant je n'obtient pas tt à fait le bon résultat. Je souhaite effectuer cette manipulation seulement sur les enregistrement de la dernière semaine passée. Donc je fais la chose suivante:

    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
     
     
    ;WITH 
    	CTE AS
    	(
    			SELECT	MIN(date_valeur) AS min_date_valeur
    				, getdate() AS max_date_valeur
    			FROM	dbo.jubourbon
                     where date_valeur>dateadd(day,-7,getdate())
    		UNION ALL
    			SELECT	DATEADD(day, 1, min_date_valeur)
    				, max_date_valeur
    			FROM	CTE
    			WHERE	min_date_valeur < max_date_valeur
    	)
    SELECT		C.min_date_valeur AS date_valeur
    		, SUM
    		(
    			CASE
    				WHEN J.date_valeur IS NULL THEN 0
    				ELSE 1
    			END
    		) AS occurences
    FROM		CTE AS C
    LEFT JOIN	dbo.jubourbon AS J ON C.min_date_valeur = J.date_valeur
    GROUP BY	C.min_date_valeur
    Dans ce cas j'obtiens bien un tableau avec tous les jours mais par contre seul la première date à la valeur 1 et le reste 0.

    Je ne comprend pas trop pourquoi.

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

Discussions similaires

  1. [AC-2003] Requete qui renvoie 0 au lieu de NUll
    Par oxino dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 15/12/2009, 12h26
  2. Requete qui renvoi un cumul et un detail
    Par shaun_the_sheep dans le forum Langage SQL
    Réponses: 9
    Dernier message: 28/04/2009, 14h27
  3. requete qui renvoi tout
    Par tortuegenie dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/08/2008, 12h44
  4. requete qui renvoi trop de resultats ?
    Par highman dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/05/2006, 10h19
  5. [VB6] recuperer une requete qui renvoie du xml
    Par voyageur dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 15/12/2004, 10h03

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