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

MS SQL Server Discussion :

[MsSql2005] SELECT avec conditionnelle


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut [MsSql2005] SELECT avec conditionnelle
    Bonjour,

    Je suis en train de réfléchir sur une requête TSQL.

    Mon objectif est de renvoyé la date en fonction de l'étape à laquelle est un bon pour une liste de bon, sachant que pour chaque étape il y a une date associé de lancement de cette étape et qu'il s'agit d'un champs dans la table.

    voici la structure de la table :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    CREATE TABLE [dbo].[DEV_BON_PEINTURE](
    	[id_bon_peinture] [int] IDENTITY(1,1) NOT NULL,
    	[id_fournisseur] [int] NULL,
    	[id_donnee] [int] NULL CONSTRAINT [DF_DEV_BON_PEINTURE_id_donnee]  DEFAULT (NULL),
    	[id_type_bon] [int] NULL,
    	[id_etape] [int] NULL,
    	[nom_bon_peinture] [varchar](50) COLLATE French_CI_AS NULL,
    	[date_DEMANDEUR] [datetime] NULL,
    	[codeR3] [varchar](200) COLLATE French_CI_AS NULL,
    	[nombre] [int] NULL,
    	[nombre_pieces_urgentes] [int] NULL,
    	[numBB] [varchar](20) COLLATE French_CI_AS NULL,
    	[teinte] [varchar](200) COLLATE French_CI_AS NULL,
    	[reference] [varchar](200) COLLATE French_CI_AS NULL,
    	[delais] [varchar](200) COLLATE French_CI_AS NULL,
    	[designation_complete] [varchar](200) COLLATE French_CI_AS NULL,
    	[observation_demandeur] [varchar](5000) COLLATE French_CI_AS NULL,
    	[tache] [int] NULL,
    	[precision_TACHE] [varchar](200) COLLATE French_CI_AS NULL,
    	[date_controle_peinture] [datetime] NULL,
    	[codeR3_controle_peinture] [varchar](200) COLLATE French_CI_AS NULL,
    	[controle_peinture] [int] NULL,
    	[observation_controle_peinture] [varchar](5000) COLLATE French_CI_AS NULL,
    	[date_controle_magasin] [datetime] NULL,
    	[codeR3_controle_magasin] [varchar](200) COLLATE French_CI_AS NULL,
    	[controle_magasin] [int] NULL,
    	[stock_magasin] [int] NULL CONSTRAINT [DF_DEV_BON_PEINTURE_stock_magasin]  DEFAULT ((0)),
    	[observation_controle_magasin] [varchar](5000) COLLATE French_CI_AS NULL,
    	[controle_destinataire_prod] [int] NULL CONSTRAINT [DF_DEV_BON_PEINTURE_controle_destinataire_prod]  DEFAULT ((0)),
    	[date_destinataire_prod] [datetime] NULL,
    	[codeR3_destinataire_prod] [varchar](200) COLLATE French_CI_AS NULL,
    	[observation_destinataire_prod] [varchar](5000) COLLATE French_CI_AS NULL,
    	[date_peinture] [datetime] NULL,
    	[codeR3_partie_peinture] [varchar](200) COLLATE French_CI_AS NULL,
    	[delais_previsionnel_peinture] [varchar](200) COLLATE French_CI_AS NULL,
    	[observation_peinture] [varchar](5000) COLLATE French_CI_AS NULL,
    	[temps_passe] [varchar](200) COLLATE French_CI_AS NULL,
    	[date_destinataire] [datetime] NULL,
    	[codeR3_destinataire] [varchar](200) COLLATE French_CI_AS NULL,
    	[observation_destinataire] [varchar](5000) COLLATE French_CI_AS NULL,
    	[id_DEMANDEUR] [varchar](50) COLLATE French_CI_AS NULL,
    	[id_CONTROLE_PEINTURE] [varchar](50) COLLATE French_CI_AS NULL,
    	[id_CONTROLE_MAGASIN] [varchar](50) COLLATE French_CI_AS NULL,
    	[id_DESTINATAIRE_PROD] [varchar](50) COLLATE French_CI_AS NULL,
    	[id_PEINTURE] [varchar](50) COLLATE French_CI_AS NULL,
    	[id_DESTINATAIRE] [varchar](50) COLLATE French_CI_AS NULL,
     
    en pseudo code cette requête donnerai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Select 
            Nom_bon_peinture,
            id_etape,
            Si id_etape=1 then selectionne la valeur date_demandeur du bon
            Sinon si id_etape IN (8,7) then selectionne la valeur date_controle_peinture du bon
            Sinon si id_etape=3 then selectionne la valeur date_peinture du bon
            Sinon si id_etape=4 then selectionne la valeur date_destinataire du bon
            Sinon si id_etape IN (5,11) then selectionne la valeur date_controle_magasin du bon
    J'ai fait une recherche sur le CASE en transact-SQL :
    http://technet.microsoft.com/fr-fr/l...5(SQL.90).aspx

    Cependant je ne sais pas si c utilisable dans mon cas de figure.

    Je ne sais pas si ma question est claire.

    Merci d'avance pour votre aide

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    Bonjour,

    J'ai trouvé une solution mais je ne sais pas si il s'agit de la meilleur solution :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<>
    -- Create date: <27/05/2009>
    -- Description:	<procedure test de récupération de la date en fonction de 
    --l'id_etape >
    -- =============================================
    ALTER PROCEDURE [dbo].[DEV_PS_test_affichage_date_etape_correspondante] 
    	-- Add the parameters for the stored procedure here
    	AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
        -- Insert statements for procedure here
    	SELECT 
    			id_bon_peinture,
    			nom_bon_peinture,
    			id_type_bon,
    			date_demandeur as date
    	FROM DEV_BON_PEINTURE
    	WHERE id_etape=1
     
    UNION
     
    	SELECT 
    			id_bon_peinture,
    			nom_bon_peinture,
    			id_type_bon,
    			date_controle_peinture as date
    	FROM DEV_BON_PEINTURE
    	WHERE id_etape IN (8,7)
     
    UNION 
     
    	SELECT 
    			id_bon_peinture,
    			nom_bon_peinture,
    			id_type_bon,
    			id_etape,
    			date_peinture as date
    	FROM DEV_BON_PEINTURE
    	WHERE id_etape=3
     
    UNION 
     
    	SELECT 
    			id_bon_peinture,
    			nom_bon_peinture,
    			id_type_bon,
    			id_etape,
    			date_destinataire as date
    	FROM DEV_BON_PEINTURE
    	WHERE id_etape=4
     
    UNION 
     
    	SELECT 
    			id_bon_peinture,
    			nom_bon_peinture,
    			id_type_bon,
    			id_etape,
    			date_controle_magasin as date
    	FROM DEV_BON_PEINTURE
    	WHERE id_etape IN (5,11)
     
    END
    Merci d'avance pour votre aide

  3. #3
    Rédacteur
    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Billets dans le blog
    121
    Par défaut
    je crois que le Case peut résoudre ton problème.
    Essaye de bidouillé quelque chose et si ne marche pas tu poste le code pour que si possible on y apporte des modifications
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  4. #4
    Rédacteur
    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Billets dans le blog
    121
    Par défaut
    Union permet de retourne le resultats de plusieurs requete en un seul jeu d'enregistrement.
    Je croyais que tu voulais renvoyé la date en fonction de l'étape ou l'on se trouve si ce le cas je ne crois pas que tu devrais utiliser union, parce que la tu retourne toute les étapes qu'a déjà traversé un bon avec répétition de certaine colonne
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  5. #5
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    bonjour,

    J'avais du faire une erreur de syntaxe lors de mes premiers essais.

    Voici la bonne syntaxe :

    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
    27
    28
    29
    30
    31
    32
    33
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<>
    -- Create date: <27/05/2009>
    -- Description:	<procedure test de récupération de la date en fonction de 
    --l'id_etape avec le CASE dans le SELECT>
    -- =============================================
    CREATE PROCEDURE [dbo].[DEV_PS_test_affichage_date_etape_correspondante_CASE] 
    	-- Add the parameters for the stored procedure here	
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
     
        -- Insert statements for procedure here
    	SELECT 
    			id_bon_peinture,
    			nom_bon_peinture,
    			id_type_bon,
    			id_etape,
    			CASE 
    				WHEN id_etape = 1 THEN date_demandeur
    				WHEN id_etape IN (8,7) THEN date_controle_peinture
    				WHEN id_etape = 3 THEN date_peinture
    				WHEN id_etape = 4 THEN date_destinataire
    				WHEN id_etape IN (5,11) THEN date_controle_magasin
    			END
    	FROM DEV_BON_PEINTURE
    END
    GO
    Cependant je n'ai pas réussit à faire mon alias pour avoir une colonne date remplaçant toutes les colonnes dates.

    Je vais chercher où je dois mettre l'alias

    Merci.

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    bonjour,

    apparemment il faut mettre l'alias après le END du CASE comme ceci :

    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
    27
    28
    29
    30
    31
    32
    set ANSI_NULLS ON
    set QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:		<>
    -- Create date: <27/05/2009>
    -- Description:	<procedure test de récupération de la date en fonction de 
    --l'id_etape avec le CASE dans le SELECT>
    -- =============================================
    ALTER PROCEDURE [dbo].[DEV_PS_test_affichage_date_etape_correspondante_CASE] 
    	-- Add the parameters for the stored procedure here	
    AS
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    
        -- Insert statements for procedure here
    	SELECT 
    			id_bon_peinture,
    			nom_bon_peinture,
    			id_type_bon,
    			id_etape,
    			CASE 
    				WHEN id_etape = 1 THEN date_demandeur
    				WHEN id_etape IN (8,7) THEN date_controle_peinture
    				WHEN id_etape = 3 THEN date_peinture
    				WHEN id_etape = 4 THEN date_destinataire
    				WHEN id_etape IN (5,11) THEN date_controle_magasin
    			END AS date
    	FROM DEV_BON_PEINTURE
    END
    Encore merci.

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Août 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 483
    Par défaut
    Union permet de retourne le resultats de plusieurs requete en un seul jeu d'enregistrement.
    Je croyais que tu voulais renvoyé la date en fonction de l'étape ou l'on se trouve si ce le cas je ne crois pas que tu devrais utiliser union, parce que la tu retourne toute les étapes qu'a déjà traversé un bon avec répétition de certaine colonne
    Bonjour,

    Pour un bon peinture donné, il n'existe qu'une et une seule étape en cours. Donc l'union ne m'affiche qu'une ligne pour un bon donné.

    Cependant il s'agissait d'une solution alternative en attendant de trouver "mieux".

    La j'ai réussit à utilisé la méthode du CASE dans le SELECT.

    Si un pro du SQL peut me dire laquel des deux méthodes est la mieux je suis preneur .

    Je vais garder pour l'instant la méthode du CASE dans le SELECT car elle me parait plus lisible.

    Merci d'avance pour votre aide.

  8. #8
    Rédacteur
    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Billets dans le blog
    121
    Par défaut
    Je voie pour le passage d'une étape a une autre tu update id_etape
    Perso la procédure stockée avec Case est plus optimisé que celle avec Union
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

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

Discussions similaires

  1. [MySQL] select avec affichage conditionnel
    Par encoupe dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 31/10/2005, 23h46
  2. Réponses: 6
    Dernier message: 08/06/2004, 14h51
  3. requete select avec AS remplacement de valeur
    Par pi3141563 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/04/2004, 22h15
  4. pb de select avec size avec choix multiple
    Par La_picolle dans le forum ASP
    Réponses: 10
    Dernier message: 28/08/2003, 15h21
  5. requete SELECT avec un nombre constant
    Par gurumeditation dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/07/2003, 20h04

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