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 :

SELECT imbriqué dans une clause SELECT


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut SELECT imbriqué dans une clause SELECT
    Salut le forum j'ai la requête 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
    SELECT 
    [IDCLIENT]
    , [IDPRODUIT]
    , MIN([Date_Operation]) AS DATEDEBUT
    ,MAX([Date_Operation]) AS DATEFIN
    ,SUM([ENTTREE]) AS RECEPTION
    ,SUM([SORTIE]) AS SORTIE
    ,SUM([RC]) AS RC
    ,SUM([SORTIE]-[RC]) AS VENTES
    ,SUM([ECART]) AS [ECART] 
    ,(SELECT distinct avg(COALESCE([JAUGE],0)) FROM SUIVISTOCKSSTATIONS WHERE [IDCLIENT]='CL17' AND [Date_Operation]='2018-01-04' GROUP BY [IDCLIENT], [IDPRODUIT]) AS JAUGEDEPARTSUPER
    FROM [dbo].[SUIVISTOCKSSTATIONS]
    WHERE [IDCLIENT]='CL17' AND[Date_Operation] BETWEEN '2018-01-04' AND '2018-11-29'
    GROUP BY [IDCLIENT], [IDPRODUIT]
    dans cette requête je souhaite avoir aussi la valeur de la colonne [JAUGE] pour [Date_Operation]='2018-01-04'
    mais j'obtient l'erreur suivant:
    Nom : Capturegffgg.PNG
Affichages : 1237
Taille : 7,7 Ko
    par contre si dans le select imbriqué je choisi un produit, j'obtient le résultat attendu pour un produit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT [IDCLIENT]
    , [IDPRODUIT]
    , MIN([Date_Operation]) AS DATEDEBUT
    ,MAX([Date_Operation]) AS DATEFIN
    ,SUM([ENTTREE]) AS RECEPTION
    ,SUM([SORTIE]) AS SORTIE
    ,SUM([RC]) AS RC
    ,SUM([SORTIE]-[RC]) AS VENTES
    ,SUM([ECART]) AS [ECART]
    ,(SELECT distinct avg(COALESCE([JAUGE],0)) FROM SUIVISTOCKSSTATIONS WHERE [IDCLIENT]='CL17' AND [Date_Operation]='2018-01-04' and [IDPRODUIT]='SUP01' GROUP BY [IDCLIENT], [IDPRODUIT]) AS JAUGEDEPARTSUPER
    FROM [dbo].[SUIVISTOCKSSTATIONS]
    WHERE [IDCLIENT]='CL17' AND[Date_Operation] BETWEEN '2018-01-04' AND '2018-11-29'
    GROUP BY [IDCLIENT], [IDPRODUIT]
    Nom : rodrigue.PNG
Affichages : 1243
Taille : 10,6 Ko
    Comment peut-on modifier cette requète pour obtenir le résultat par Client et grouper par produit?

  2. #2
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 075
    Points
    28 075
    Par défaut
    Comme ça en première approche, je proposerais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT [IDCLIENT]
    , [IDPRODUIT]
    , MIN([Date_Operation]) AS DATEDEBUT
    ,MAX([Date_Operation]) AS DATEFIN
    ,SUM([ENTTREE]) AS RECEPTION
    ,SUM([SORTIE]) AS SORTIE
    ,SUM([RC]) AS RC
    ,SUM([SORTIE]-[RC]) AS VENTES
    ,SUM([ECART]) AS [ECART]
    ,(SELECT distinct avg(COALESCE([JAUGE],0)) FROM SUIVISTOCKSSTATIONS B WHERE B.[IDCLIENT]=A.IDCLIENT AND [Date_Operation]='2018-01-04' and B.[IDPRODUIT]=A.IDPRODUIT) AS JAUGEDEPARTSUPER
    FROM [dbo].[SUIVISTOCKSSTATIONS] A 
    WHERE [IDCLIENT]='CL17' AND[Date_Operation] BETWEEN '2018-01-04' AND '2018-11-29'
    GROUP BY [IDCLIENT], [IDPRODUIT]
    Sachant que avg() n'a, ici, de raison d'être que si tu as plusieurs jauges en date du '2018-01-04' pour un même client et un même produit. Sinon, si tu n'as qu'une seule valeur à cette date là tu peux te passer de avg

    Mais ta seconde requête semble donner déjà le résultat que tu demande, non ?
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  3. #3
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    Bonsoir sevyc64 merci sa marche mais le temps d'exécution est tellement élevé environ 18 seconde

  4. #4
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    voila la requète final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT [IDCLIENT]
    , [IDPRODUIT]
    , MIN([Date_Operation]) AS DATEDEBUT
    ,MAX([Date_Operation]) AS DATEFIN
    ,SUM([ENTTREE]) AS RECEPTION
    ,SUM([SORTIE]) AS SORTIE
    ,SUM([RC]) AS RC
    ,SUM([SORTIE]-[RC]) AS VENTES
    ,SUM([ECART]) AS [ECART]
    ,(SELECT distinct (COALESCE(B.[JAUGE],0)) FROM SUIVISTOCKSSTATIONS B WHERE B.[IDCLIENT]=A.IDCLIENT AND B.[Date_Operation]='2018-01-04' and B.[IDPRODUIT]=A.IDPRODUIT) AS JAUGEDEPAR
    ,(SELECT distinct (COALESCE(B.[JAUGE],0)) FROM SUIVISTOCKSSTATIONS B WHERE B.[IDCLIENT]=A.IDCLIENT AND B.[Date_Operation]='2018-11-29' and B.[IDPRODUIT]=A.IDPRODUIT) AS JAUGEFIN
    FROM [dbo].[SUIVISTOCKSSTATIONS] A
    WHERE [IDCLIENT]='CL17' AND[Date_Operation] BETWEEN '2018-01-04' AND '2018-11-29'
    GROUP BY A.[IDCLIENT], A.[IDPRODUIT]
    et le résultat rechercher
    Nom : ddddd.PNG
Affichages : 1260
Taille : 19,6 Ko
    mais comme vous pouvez le constater sur l'image le temps d'exécution est tellement élevé

  5. #5
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 075
    Points
    28 075
    Par défaut
    Une autre solution peut-être :

    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
    SELECT A.*,COALESCE(B.[JAUGE],0) AS JAUGEDEPART, COALESCE(C.[JAUGE],0) AS JAUGEFIN
    FROM (
    	SELECT [IDCLIENT]
    	, [IDPRODUIT]
    	, MIN([Date_Operation]) AS DATEDEBUT
    	,MAX([Date_Operation]) AS DATEFIN
    	,SUM([ENTTREE]) AS RECEPTION
    	,SUM([SORTIE]) AS SORTIE
    	,SUM([RC]) AS RC
    	,SUM([SORTIE]-[RC]) AS VENTES
    	,SUM([ECART]) AS [ECART]
    	FROM [dbo].[SUIVISTOCKSSTATIONS] 
    	WHERE [IDCLIENT]='CL17' AND[Date_Operation] BETWEEN '2018-01-04' AND '2018-11-29'
    	GROUP BY [IDCLIENT], [IDPRODUIT]
    	) A
    INNER JOIN [dbo].[SUIVISTOCKSSTATIONS] B ON A.IDCLIENT = B.IDCLIENT AND A.IDPRODUIT = B.IDPRODUIT AND B.[Date_Operation]=A.DATEDEBUT
    INNER JOIN [dbo].[SUIVISTOCKSSTATIONS] C ON A.IDCLIENT = C.IDCLIENT AND A.IDPRODUIT = C.IDPRODUIT AND C.[Date_Operation]=A.DATEFIN
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Massigne Voir le message
    mais comme vous pouvez le constater sur l'image le temps d'exécution est tellement élevé
    Dites-nous en plus sur vos tables et vos volumétrie, sinon on peut pas faire grand chose pour vous aider.

  7. #7
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    Bonsoir 7gyY9w1ZY6ySRgPeaefZ la première requète propser par sevyc64 marche très bien j'ai compris mon erreur je travaillais avec des vues
    voila la requete final
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT [IDCLIENT]
    , [IDPRODUIT]
    , MIN([Date_Operation]) AS DATEDEBUT
    ,MAX([Date_Operation]) AS DATEFIN
    ,SUM([ENTTREE]) AS RECEPTION
    ,MAX([INDEX])-MIN([INDEX]) AS SORTIE
    	,SUM([RC]) AS RC
    	,(MAX([INDEX])-MIN([INDEX])-sum([RC])) AS VENTES
    ,SUM([RC]) AS RC
    ,(SELECT distinct sum(COALESCE(B.[QUANTITE],0)) FROM [dbo].[STOCKDEBUTPARCUVEETPARSTATION] B WHERE B.[IDCLIENT]=A.IDCLIENT AND B.[Date_Operation]='2018-01-04' and B.[IDPRODUIT]=A.IDPRODUIT group by B.[IDPRODUIT], b.IDCLIENT ) AS JAUGEDEPAR
    ,(SELECT distinct sum(COALESCE(B.[QUANTITE],0)) FROM [dbo].[STOCKDEBUTPARCUVEETPARSTATION] B WHERE B.[IDCLIENT]=A.IDCLIENT AND B.[Date_Operation]='2018-11-29' and B.[IDPRODUIT]=A.IDPRODUIT group by B.[IDPRODUIT], b.IDCLIENT ) AS JAUGEFIN
    FROM [dbo].[GESTIONSORTIESTATIONS] A
    WHERE [IDCLIENT]='CL17' AND[Date_Operation] BETWEEN '2018-01-04' AND '2018-11-29' and [IDPRODUIT]!=''
    GROUP BY A.[IDCLIENT], A.[IDPRODUIT]

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2018
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par Massigne Voir le message
    Bonsoir sevyc64 merci sa marche mais le temps d'exécution est tellement élevé environ 18 seconde
    Si tu passe ton SELECT avec le GROUP BY dans un WITH que tu viens appeler fans ton main en y rajoutant ta close WHERE seulement ici, cela pourrai également diminuer ton temps de réponse.

  9. #9
    Membre régulier
    Homme Profil pro
    ETUDE
    Inscrit en
    Septembre 2016
    Messages
    360
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : ETUDE
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 360
    Points : 117
    Points
    117
    Par défaut
    Bonjour Nerge_SQL je ne comprend pas bien votre réponse pouvez vous être plus claire?

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2018
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Décembre 2018
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    Salut Massigne, tu m'excusera je ne suis pas certain de l'exactitude de la syntaxe, ne pouvant tester la requête. Mais j'espere que ça pourra t'aider !

    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
     
    WITH
    Agregats AS
    (
    SELECT [IDCLIENT]
    , [IDPRODUIT]
    , MIN([Date_Operation]) AS DATEDEBUT
    ,MAX([Date_Operation]) AS DATEFIN
    ,SUM([ENTTREE]) AS RECEPTION
    ,SUM([SORTIE]) AS SORTIE
    ,SUM([RC]) AS RC
    ,SUM([SORTIE]-[RC]) AS VENTES
    ,SUM([ECART]) AS [ECART]
    ,(SELECT distinct (COALESCE(B.[JAUGE],0)) FROM SUIVISTOCKSSTATIONS B WHERE B.[IDCLIENT]=A.IDCLIENT AND B.[Date_Operation]='2018-01-04' and B.[IDPRODUIT]=A.IDPRODUIT) AS JAUGEDEPAR
    ,(SELECT distinct (COALESCE(B.[JAUGE],0)) FROM SUIVISTOCKSSTATIONS B WHERE B.[IDCLIENT]=A.IDCLIENT AND B.[Date_Operation]='2018-11-29' and B.[IDPRODUIT]=A.IDPRODUIT) AS JAUGEFIN
    FROM [dbo].[SUIVISTOCKSSTATIONS] A
    GROUP BY A.[IDCLIENT], A.[IDPRODUIT]
    )
    SELECT Agregats.*
    From Agregats
    WHERE [IDCLIENT]='CL17' AND[Date_Operation] BETWEEN '2018-01-04' AND '2018-11-29'

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/06/2014, 17h11
  2. [EF] Entite SQL - Requête dans une clause select
    Par Marsupilami_00 dans le forum Accès aux données
    Réponses: 0
    Dernier message: 20/11/2009, 11h05
  3. Réponses: 1
    Dernier message: 10/05/2009, 02h07
  4. Réponses: 11
    Dernier message: 04/08/2008, 18h04
  5. 3 conditions dans une clause SELECT
    Par Aurèl90 dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 03/11/2005, 16h05

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