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 :

Deux requêtes en une seule


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Points : 144
    Points
    144
    Par défaut Deux requêtes en une seule
    Bonjour,

    J'ai besoin de réaliser une requête SQL qui me permet récupère 2 indicateurs pour une semaine données.
    En fait, une donnée est basée sur une colonne "SOUMISSION_DATE" et l'autre sur une colonne "MAJ_DATE".

    Pour faire avec 2 requête pas de problème.

    Requête 1 - sur SOUMISSION_DATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT str_to_date(concat(yearweek(MA_TABLE.SOUMISSION_DATE), ' Sunday'), '%X%V %W') AS SOUMISSION_DATE, count(*) AS 'NOMBRE TICKET'
    FROM MA_TABLE
    	WHERE MA_TABLE.SOUMISSION_DATE > (NOW() - INTERVAL 24 WEEK)
    GROUP BY str_to_date(concat(yearweek(MA_TABLE.SOUMISSION_DATE), ' Sunday'), '%X%V %W')
    ORDER BY str_to_date(concat(yearweek(MA_TABLE.SOUMISSION_DATE), ' Sunday'), '%X%V %W') ASC
    Requête 2 - sur MAJ_DATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT str_to_date(concat(yearweek(MA_TABLE.MAJ_DATE), ' Sunday'), '%X%V %W') AS MAJ_DATE, count(*) AS 'NOMBRE TICKET'
    FROM MA_TABLE
    	WHERE MA_TABLE.MAJ_DATE > (NOW() - INTERVAL 24 WEEK)
    	AND MA_TABLE.ETAT = 'Ferme'
    GROUP BY str_to_date(concat(yearweek(MA_TABLE.MAJ_DATE), ' Sunday'), '%X%V %W')
    ORDER BY str_to_date(concat(yearweek(MA_TABLE.MAJ_DATE), ' Sunday'), '%X%V %W') ASC

    Pouvez-vous m'aider à faire ces deux requêtes en une seule s'il vous plait?

    Merci pour votre aide,

    Matt

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 251
    Points : 12 903
    Points
    12 903
    Par défaut
    Bonjour,
    Dans la première requête, tu peux ajout un SUM(case when…) pour ne compter que les lignes dont Etat = 'Ferme', et le tour est joué.

    Tatayo.

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Points : 144
    Points
    144
    Par défaut
    Bonjour,

    Merci pour ton aide,

    Par contre, comment puis-je traiter le fait que les balises ORDER et GROUP BY sont réalisées sur des colonnes DATE différentes?

    Matt

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 251
    Points : 12 903
    Points
    12 903
    Par défaut
    Autant pour moi, je n'avais pas vu que les deux requêtes utilisaient des colonnes différentes.
    Suivant le SGBD utilisé, tu peux utiliser 2 CTE et faire une jointure des 2 tables (sur la date ?).
    Ca résout le problème des GROUP BY. Pour ce qui est du tri, là je ne vois pas trop.
    Peux-tu nous monter un exemple et le résultat attendu ?

    Tatayo.

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    467
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 467
    Points : 144
    Points
    144
    Par défaut
    Bonjour,

    Ma requête pour les tickets ouvert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT str_to_date(concat(yearweek(MA_TABLE.SOUMISSION_DATE), ' Sunday'), '%X%V %W') AS SOUMISSION_DATE, count(*) AS 'NOMBRE TICKET'
    FROM MA_TABLE
    	WHERE MA_TABLE.SOUMISSION_DATE > (NOW() - INTERVAL 24 WEEK)
    GROUP BY str_to_date(concat(yearweek(MA_TABLE.SOUMISSION_DATE), ' Sunday'), '%X%V %W')
    ORDER BY str_to_date(concat(yearweek(MA_TABLE.SOUMISSION_DATE), ' Sunday'), '%X%V %W') ASC
    Ma requête pour les tickets fermés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT str_to_date(concat(yearweek(MA_TABLE.MAJ_DATE), ' Sunday'), '%X%V %W') AS MAJ_DATE, count(*) AS 'NOMBRE TICKET'
    FROM MA_TABLE
    	WHERE MA_TABLE.MAJ_DATE > (NOW() - INTERVAL 24 WEEK)
    	AND MA_TABLE.ETAT = 'Ferme'
    GROUP BY str_to_date(concat(yearweek(MA_TABLE.MAJ_DATE), ' Sunday'), '%X%V %W')
    ORDER BY str_to_date(concat(yearweek(MA_TABLE.MAJ_DATE), ' Sunday'), '%X%V %W') ASC

    Résultat des 2 requêtes exécutées séparément :
    Nom : NB_TICKET.png
Affichages : 141
Taille : 25,0 Ko

    Matt

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 251
    Points : 12 903
    Points
    12 903
    Par défaut
    Je vois bien une requête du genre:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    with
    req1 as (// Ici la première requête),
    req2 as (// ici la deuxième requête)
    select coalesce(r1.SOUMISSION_DATE,r2.MAJ_DATE),sum(r1.NOMBRE_TICKET),sum(r2.NOMBRE_TICKET)
    from r1
    full outer join r2 on r1.SOUMISSION_DATE = r2.MAJ_DATE
    group by coalesce(r1.SOUMISSION_DATE,r2.MAJ_DATE)
    order by 1
    Il y a peut-être 2/3 adaptations à faire, je ne maitrise pas encore très bien les CTE. Mais l'idée principale est là.

    Tatayo.

  7. #7
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 792
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonsoir,
    Citation Envoyé par tatayo Voir le message
    Il y a peut-être 2/3 adaptations à faire, je ne maitrise pas encore très bien les CTE. Mais l'idée principale est là.
    comme modification : vu que les regroupements ont été fait dans les CTE plus besoin d'en refaire dans la requête finale.
    Le coalesce et le full outer join forme effectivement l'axe principal.

  8. #8
    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


    sinon, une autre approche à base d'UNION
    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 tmp AS (
    	SELECT
    			str_to_date(concat(yearweek(MA_TABLE.SOUMISSION_DATE), ' Sunday'), '%X%V %W') AS SOUMISSION_DATE
    			, 1 AS Nb1
    			, 0 AS Nb2
    	FROM MA_TABLE
    	WHERE MA_TABLE.SOUMISSION_DATE > (NOW() - INTERVAL 24 WEEK)
     
    	UNION ALL
     
    	SELECT 
    			str_to_date(concat(yearweek(MA_TABLE.MAJ_DATE), ' Sunday'), '%X%V %W') 
    			, 0
    			, 1
    	FROM MA_TABLE
    	WHERE MA_TABLE.MAJ_DATE > (NOW() - INTERVAL 24 WEEK)
    	AND MA_TABLE.ETAT = 'Ferme'
    )
    SELECT 
    		SOUMISSION_DATE
    	,	SUM(Nb1) AS Nb1
    	,	SUM(Nb2) AS Nb2
    FROM tmp
    GROUP BY SOUMISSION_DATE
    ORDER BY SOUMISSION_DATE

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/01/2018, 10h12
  2. Réponses: 2
    Dernier message: 24/07/2015, 14h34
  3. Deux requêtes dans une seule requête, est-ce possible ?
    Par Stephane_br dans le forum Développement
    Réponses: 3
    Dernier message: 08/07/2011, 15h35
  4. [MSSQL 2K5] PBM pour mixer deux requêtes en une seule
    Par fredfred dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/07/2010, 15h12
  5. Deux requêtes en une seule?
    Par pcsystemd dans le forum Requêtes
    Réponses: 5
    Dernier message: 09/07/2009, 16h28

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