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 :

[SQL 2K] Choix / Ou exclusif


Sujet :

MS SQL Server

  1. #1
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut [SQL 2K] Choix / Ou exclusif
    [SQL 2000]


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     create table Traitement
     (
     cod_client	char(6),
     exerci	             int,
     resultat	             int,
     envoi           	datetime)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    insert into traitement (cod_client,exerci,resultat,envoi)
    values (1,100,1000,'30/06/06')
    insert into traitement (cod_client,exerci,resultat,envoi)
    values (1,100,1200,'30/09/06')
    insert into traitement (cod_client,exerci,resultat,envoi)
    values (1,100,1800,'30/08/06')
     
    insert into traitement (cod_client,exerci,resultat,envoi)
    values (2,100,1000,'30/06/06')
    insert into traitement (cod_client,exerci,resultat,envoi)
    values (2,100,1000, '30/09/06')
    insert into traitement (cod_client,exerci,resultat,envoi)
    values (2,100,1000, '30/08/06')


    la regle est la suivante,
    pour un exercice donné d'un client, si je trouve l'ensemble des resultats identiques => je dois retourner le max de la colonne 'envoi'

    Sinon si pour un exercice donné d'un client je trouve un résultat différent, je dois renvoyer la valeur nulle.

    Pour ces enregistrements ci dessus, je dois retourner
    pour le client 1 la date envoi a nulle
    (car resultats différent pour un meme client et un meme exercice)
    pour le client 2 la date envoi = 30/09/06
    (car resultats identique et car le maximum = 30/06/06)


    Quelle genre de requete verriez vous pour répondre a ces besoins ?

    Je pensais a un select case mais je patauge ..

    Merci pour votre aide !!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Bjr,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select Cod_client,
    CASE count(distinct Resultat)
       WHEN 1 then max(envoi)
       else null
    END
    from traitement
    group by Cod_Client
    Resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    1     	NULL
    2     	2006-09-30 00:00:00.000

  3. #3
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Merci beaucoup, je suis agréablement étonné de la puissance de ce code.. ceci étant la donne a changé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update traitement set envoi = null where resultat = 1800 and cod_client = 1
    Pour un exercice donné d'un client,
    dans le cas ou j'ai une date envoi à nul, je dois lire et comparer les resultats et si ils sont différents je dois renvoyer nul. Sinon je dois renvoyer la date max

    dans le cas ou je n'ai pas de date envoi a nul, je dois renvoyer la date max

    Je crois bien que c'est un select case imbriqué.. je cherche je cherche

    En attendant encore MERCI

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Re,

    je veux juste reformuler ta demande :

    Si pour un client donné, pour un exercice donné :
    1 : si une date est null, on vérifie le nombre de résultat :
    1-1 : si ce nombre = 1 on renvoie la date max
    1-2 : si ce nombre est >1 on renvoi null

    2- Si aucune date n'est nulle, on renvoie systématiquement la date max et ce quel que soit le nombre de résultat (1 ou plus) ?


    Si j'ai compris, il convient de préciser qqchose : on renverra LE COD_CLIENT, EXERCIC et la date (nulle ou max).

    Dans ton exemple initiale (et dans mon code) on ne renvoie pas l'exerice or ce devrait être le cas non ?

  5. #5
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par ZERS
    Re,

    je veux juste reformuler ta demande :

    Si pour un client donné, pour un exercice donné :
    1 : si une date est null, on vérifie le nombre de résultat :
    1-1 : si ce nombre = 1 on renvoie la date max
    1-2 : si ce nombre est >1 on renvoi null

    2- Si aucune date n'est nulle, on renvoie systématiquement la date max et ce quel que soit le nombre de résultat (1 ou plus) ?
    Effectivement, c'est bien ca !! J'ai réussi à me faire comprendre !!! Et je crois déja entrevoir une maniere d'ecrire cette requete

    Citation Envoyé par ZERS
    Si j'ai compris, il convient de préciser qqchose : on renverra LE COD_CLIENT, EXERCIC et la date (nulle ou max).

    Dans ton exemple initiale (et dans mon code) on ne renvoie pas l'exerice or ce devrait être le cas non ?
    Effectivement il faut renvoyer le cod_client, l'exercice et la date d'envoi...

    Faudrait il plutot préparer la table avec un curseur à votre avis?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Pas besoin du curseurs
    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
     
    --CAS DES EXERCICES AVEE DATE A NULL
    select 
    	T.Cod_client,
    	T.exerci,
    	CASE count(distinct T.Resultat)
       WHEN 1 then max(T.envoi)
       else null
    END
    from traitement T inner join 
    	(
    		select distinct COD_CLIENT, exerci 
    		from traitement
    		where envoi is null
    	) B
    on 
    	T.COD_CLIENT = B.COD_CLIENT 
    	AND T.exerci = B.exerci
    group by 
    	T.Cod_Client,
    	T.Exerci
    --LES AUTRES : pour un client, un exercice, aucune des dates est null
    UNION 
    SELECT  t.Cod_Client, 
    	t.exerci, 
    	max(t.envoi)
    from traitement t
    where not exists (
    	select Cod_Client, exerci 
    	from traitement f 
    	where f.Cod_Client = t.Cod_Client
    	and f.exerci = t.exerci
    	and f.envoi is null
    )
    group by 
    	t.Cod_Client, 
    	t.exerci

  7. #7
    Membre habitué
    Profil pro
    Développeur .Net, Administrateur système
    Inscrit en
    Octobre 2003
    Messages
    219
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur .Net, Administrateur système
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2003
    Messages : 219
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par ZERS
    Pas besoin du curseurs
    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
     
    --CAS DES EXERCICES AVEE DATE A NULL
    select 
    	T.Cod_client,
    	T.exerci,
    	CASE count(distinct T.Resultat)
       WHEN 1 then max(T.envoi)
       else null
    END
    from traitement T inner join 
    	(
    		select distinct COD_CLIENT, exerci 
    		from traitement
    		where envoi is null
    	) B
    on 
    	T.COD_CLIENT = B.COD_CLIENT 
    	AND T.exerci = B.exerci
    group by 
    	T.Cod_Client,
    	T.Exerci
    --LES AUTRES : pour un client, un exercice, aucune des dates est null
    UNION 
    SELECT  t.Cod_Client, 
    	t.exerci, 
    	max(t.envoi)
    from traitement t
    where not exists (
    	select Cod_Client, exerci 
    	from traitement f 
    	where f.Cod_Client = t.Cod_Client
    	and f.exerci = t.exerci
    	and f.envoi is null
    )
    group by 
    	t.Cod_Client, 
    	t.exerci

    Quand je vois ca, je me dis que j'etais bien loin du résultat !!!

    Enfin merci beaucoup, j'ai appris de nouvelles techniques grace a toi !!!

    MERCI !!!!!

    ps : Ca n'existe pas les cases imbriqués ?

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    434
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 434
    Points : 502
    Points
    502
    Par défaut
    Citation Envoyé par b_lob
    ps : Ca n'existe pas les cases imbriqués ?
    Salut,

    si on peut faire des cases imbriqués mais je n'ai jamais essayé car je n'en avais pas le besoin.

    Dans ton cas ce doit être faisable mais la solution que je t'ai apportée est surement plus lisible. Mais les spécialistes SQL pourront surement optimiser cela

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/01/2014, 00h51
  2. [SQL] Meilleur choix de developpement
    Par sirbaldur dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 10/08/2006, 18h44
  3. Choix entre DB2 As/400 et Sql Server ou Mysql
    Par lesaisidufond dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 30/08/2005, 09h57
  4. [SQL Serv2000][Indexation Texte Integral]Choix menu grisé
    Par TreizeSegments dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/12/2004, 09h21
  5. Choix technique DB ACCESS / SQL Server et internet
    Par Yoann_D dans le forum Décisions SGBD
    Réponses: 12
    Dernier message: 29/07/2003, 17h12

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