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 :

Condition(s) dans un select


Sujet :

MS SQL Server

  1. #1
    Membre actif Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Points : 270
    Points
    270
    Par défaut Condition(s) dans un select
    Bonjour,

    Suite à un bug concernant la mise en état de données récupérées via une requête SQL sous MS Server, je me suis aperçu qu'un enregistrement ne s'affichait pas.

    Pour cause, la requête ci-dessous récupère la chaîne de caracteres située devant le premier "/" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select 
    distinct substring(description, 0,CHARINDEX('/',description)) as groupe_juridique 
    from e_infos_relances, e_factures_nonreglees 
    where substring(description, 0,CHARINDEX('/',description)) is not null 
    and substring(description, 0,CHARINDEX('/',description)) <> '' 
    and e_infos_relances.dossier = e_factures_nonreglees.dossier 
    and periode >= '22/05/2008' 
    and periode <= '23/05/2008' 
    order by 1
    Or, l'enregistrement manquant ne possède pas de "/" dans sa chaine mais un "-".

    Comment puis je ajouter cette nouvelle condition dans ma requête ?

    Je n'arrive pas du tout à savoir comment je peux ajouter cette nouvelle condition dans ma première ligne du SELECT.

    MERCI

  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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Ne vous est-il pas possible de remplacer ce tirez par un slash ?
    Sinon, vous pouvez par exemple é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
    24
    WITH
    	CTE_SLASH AS
    	(
    		SELECT SUBSTRING(description, 0,CHARINDEX('/',description)) AS groupe_juridique 
    		FROM e_infos_relances RELANCES
    		JOIN e_factures_nonreglees IMPAYES ON RELANCES.dossier = IMPAYES.dossier
    		WHERE SUBSTRING(description, 0,CHARINDEX('/',description)) IS NOT NULL 
    		AND SUBSTRING(description, 0,CHARINDEX('/',description)) <> '' 
    		AND periode >= '22/05/2008'
    		AND periode <= '23/05/2008'
    	),
    	CTE_TIRET AS
    	(
    		SELECT SUBSTRING(description, 0,CHARINDEX('-',description)) AS groupe_juridique 
    		FROM e_infos_relances RELANCES
    		JOIN e_factures_nonreglees IMPAYES ON RELANCES.dossier = IMPAYES.dossier
    		WHERE SUBSTRING(description, 0,CHARINDEX('-',description)) IS NOT NULL 
    		AND SUBSTRING(description, 0,CHARINDEX('-',description)) <> '' 
    		AND periode >= '22/05/2008'
    		AND periode <= '23/05/2008'
    	)
    	SELECT groupe_juridique FROM CTE_SLASH
    UNION
    	SELECT groupe_juridique FROM CTE_TIRET
    l'UNION se chargera de prendre les valeurs distinctes sur les deux ensembles (à la différence de UNION ALL).
    Essayez et dites-nous si cela fonctionne ...

    @++

  3. #3
    Membre actif Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Points : 270
    Points
    270
    Par défaut
    Citation Envoyé par elsuket Voir le message
    Bonjour,

    Ne vous est-il pas possible de remplacer ce tirez par un slash ?
    Non, impossible. Explications : base en prod concernant une liste de clients existant depuis au moins 5 ans. Un ERP se base la dessus et des éléments comptables sont calculés sur ces clients.

    Concernant la requête, elle fonctionne MAIS j'ai des lignes en doublon dont des lignes qui affichent le "/".

    Au lieu de récupérer 12 lignes, j'en récupère 16 dont 4 avec le "/". Ces 4 là, je ne les veux pas.

    Je crois qu'en faisant l'UNION, cela génère ce porblème

  4. #4
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Avez-vous essayé de rajouter un DISTINCT dans les deux CTE ?

    @++

  5. #5
    Membre actif Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Points : 270
    Points
    270
    Par défaut
    oui mais rien y fait

  6. #6
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Et 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
    SELECT DISTINCT groupe_juridique
    FROM
    (
    		SELECT DISTINCT SUBSTRING(description, 0,CHARINDEX('-',description)) AS groupe_juridique 
    		FROM e_infos_relances RELANCES
    		JOIN e_factures_nonreglees IMPAYES ON RELANCES.dossier = IMPAYES.dossier
    		WHERE SUBSTRING(description, 0,CHARINDEX('-',description)) IS NOT NULL 
    		AND SUBSTRING(description, 0,CHARINDEX('-',description)) <> '' 
    		AND periode >= '22/05/2008'
    		AND periode <= '23/05/2008'
    	UNION
    		SELECT DISTINCT SUBSTRING(description, 0,CHARINDEX('/',description)) AS groupe_juridique 
    		FROM e_infos_relances RELANCES
    		JOIN e_factures_nonreglees IMPAYES ON RELANCES.dossier = IMPAYES.dossier
    		WHERE SUBSTRING(description, 0,CHARINDEX('/',description)) IS NOT NULL 
    		AND SUBSTRING(description, 0,CHARINDEX('/',description)) <> '' 
    		AND periode >= '22/05/2008'
    		AND periode <= '23/05/2008'
    ) TMP

  7. #7
    Membre actif Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Points : 270
    Points
    270
    Par défaut
    non tjs pas

    exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    BOSCH FRANCE SAS
    BOSCH FRANCE SAS/JEC300
    le 2eme j'en veux pas

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    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 772
    Points : 52 737
    Points
    52 737
    Billets dans le blog
    5
    Par défaut
    Plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH T_CORRECT
    AS
    (SELECT REPLACE(description, '-', '/') AS description, dossier
     FROM   e_infos_relances
            INNER JOIN e_factures_nonreglees AS FN
                  ON C.dossier = FN.dossier
    WHERE   periode BETWEEN '20080522' AND '20080523')
    SELECT DISTINCT substring(description, 0,CHARINDEX('/',description)) AS groupe_juridique 
    FROM   T_CORRECT
    WHERE  COALESCE(substring(description, 0,CHARINDEX('/',description)), '') <> ''
    ORDER  BY 1
    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/ * * * * *

  9. #9
    Membre actif Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Points : 270
    Points
    270
    Par défaut
    Effectivement, ça marche !!

    Pour ce qui est du plus simple

    Merci beaucoup. Résolu

  10. #10
    Membre actif Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Points : 270
    Points
    270
    Par défaut
    Désolé de revenir là dessus après voir mis "RESOLU", mais là j'ai un petit problème de performance.

    En effet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT substring(description, 0,CHARINDEX('/',description)) AS groupe_juridique 
     FROM  (SELECT REPLACE(description, '-', '/') AS description 
     FROM   e_infos_relances 
    INNER JOIN e_factures_nonreglees
     ON e_infos_relances .dossier = e_factures_nonreglees.dossier 
     WHERE   periode BETWEEN '01/01/2008' AND '31/12/2008') as t 
     WHERE  COALESCE(substring(description, 0,CHARINDEX('/',description)), '') <> '' 
     ORDER  BY 1
    1min 22 pour 1877 lignes, je trouve ça un peu long.

    N'y a t'il pas moyen de faire quelque chose pour que ce soit plus rapide ?


    PS : c'est une requete qui va me lister des clients, et cette liste rempli une liste déroulante sous ASP.
    Et à chaque démarrage de la page, cette liste déroulante se repli par rapport à la date.

    Donc plus la période est longue, plus l'état ASP est long à s'afficher à cause de la requête

    Merci

  11. #11
    Membre actif Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Points : 270
    Points
    270
    Par défaut
    je viens de regarder un truc. la partie centrale de la requête affiche 12259 lignes en 0.00 sec, donc très rapide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT REPLACE(description, '-', '/') AS description 
     FROM   e_infos_relances 
    INNER JOIN e_factures_nonreglees
     ON e_infos_relances .dossier = e_factures_nonreglees.dossier 
     WHERE   periode BETWEEN '01/01/2008' AND '31/12/2008'
    C'est le replace je pense qui prend énormément de temps, et c'est très énervant

  12. #12
    Membre actif Avatar de stolx_10
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 374
    Points : 270
    Points
    270
    Par défaut
    Autre essai

    COALESC prend énormément de temps, ce n'est pas une fonction indispensable et même très mal foutue.

    Je l'ai viré et remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    substring(description, 0,CHARINDEX('/',description)) <> '' 
     and substring(description, 0,CHARINDEX('/',description)) is not null
    Au lieu d'attendre 1 min 22, je suis descendu à 1 seconde !!


    Voilà, merci
    J'espère que ça aidera des gens

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

Discussions similaires

  1. Problème avec condition WHERE dans commande SELECT
    Par Badouba76 dans le forum Objective-C
    Réponses: 3
    Dernier message: 08/11/2013, 18h19
  2. Réponses: 4
    Dernier message: 20/11/2012, 12h54
  3. condition dans requête select
    Par lionel256 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/05/2008, 10h23
  4. [MySQL] Problème de condition dans le SELECT
    Par nicocaine dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 15/06/2007, 08h20
  5. Réponses: 3
    Dernier message: 03/05/2007, 11h06

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