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 avec fonction table compliquée


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Par défaut select avec fonction table compliquée
    Salut à tous

    J'ai une requete qui cherche des lignes avec un champ codejour

    le probleme c'est qu'elle doit me retourner pour chaque ligne plusieurs ligne en dépend du
    codeJour

    codeJour contient des valeurs qui ont des sinification précises par exemple

    65 veut dire Samedi et Vendredi
    7 veut dire Lundi et Dimanche et Mardi parceque dimanche=1, Lundi=2, Mardi=4 ....

    voilà ce que j'ai fait

    j'ai fait une fonction scalaire appelé (JourReg) qui me retourne une chaine contanant les jours trouvés
    en voici un morceau


    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
     
     
    	declare @resultat nvarchar(250)
     
    	set @resultat=''
     
    	if @codeJour >=64 
    		begin
    			set @resultat = 'Samedi'
    			set @codeJour = @codeJour - 64
    		end
     
    	if @codeJour >=32 
    		begin
    			if @resultat =''
    				set @resultat = 'Vendredi'
    			else
    				set @resultat = @resultat + 'Vendredi'
    			set @codeJour = @codeJour - 32
    		end
     
    	if @codeJour >=16 
    		begin
    			if @resultat =''
    				set @resultat = 'Jeudi'
    			else
    				set @resultat = @resultat + 'Jeudi'
    			set @codeJour = @codeJour - 16
    		end
     
    ........
    après j'ai fait une fonction table (son nom est listeJour) qui me retourne cette chaine en liste des jours




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    select JOUR from (
     
    	select case when  CHARINDEX('Lundi', JourReg(65) ,1) <>  0 then 'Lundi' end jour
    	union
    	select case when  CHARINDEX('Samedi', JourReg(65) ,1) <>  0 then 'Samedi' end jour
    	union
    	select case when  CHARINDEX('Vendredi', JourReg(65) ,1) <>  0 then 'Vendredi' end jour
    	union
    	select case when  CHARINDEX('Jeudi', JourReg(65) ,1) <>  0 then 'Jeudi' end jour
     
    ) lg where jour is not null



    Maintenant je fait ma procedure stockes qui va aller chercher mes données et mutliplier chaque
    ligne par le nombre de jours trouvés, mais elle marche pas, car il me permet pas d'utiliser
    le champ CodeJour de la mesServices


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select * from mesServices() HPRS
     
    	  , listeJour(HPRS.CodeJour) HPJ


    avez vous une idée comment je peux le faire

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    il serait beaucoup plus simple de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE @JOURS INT;
    SET @JOURS = 65
    SELECT '' + CASE WHEN @JOURS & 1 = 1   THEN ', Lundi'    ELSE '' END
              + CASE WHEN @JOURS & 2 = 2   THEN ', Mardi'    ELSE '' END
              + CASE WHEN @JOURS & 4 = 4   THEN ', Mercredi' ELSE '' END
              + CASE WHEN @JOURS & 8 = 8   THEN ', Jeudi'    ELSE '' END
              + CASE WHEN @JOURS & 16 = 16 THEN ', Vendredi' ELSE '' END
              + CASE WHEN @JOURS & 32 = 32 THEN ', Samedi'   ELSE '' END
              + CASE WHEN @JOURS & 64 = 64 THEN ', Dimanche' ELSE '' END
    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/ * * * * *

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Par défaut
    Merci pour votre réponse rapide

    je vais changer ma fonction scalaire par votre proposition , c'est vrai c'est plus simple

    Mais mon grand probleme c'est la derniere select que j'ai mis
    je veux chercher mes données et mutliplier chaque ligne par le nombre de jours trouvés,
    par exemple une ligne qui contient comme codejour =7 doit retourner 3 lignes au lieu de une seule , une avec Lundi, 2eme avec Mardi, et la 3eme avec Mercredi

    vous voyez mon probleme?

    Merci

  4. #4
    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
    Par défaut
    Bonjour,

    En postant ce type de problème, il est préférable de fournir un jeu d'essai sous forme de create table et insert. ça permet à ceux qui souhaitent vous aider de pouvoir proposer plus rapidement une solution.

    Prenons donc par exemple une table contenant une liste d'évènements avec leurs jours dans la semaine sous forme de masque de bit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE TABLE EVENEMENT(
    	id INT NOT NULL CONSTRAINT PK_EVENEMENT PRIMARY KEY IDENTITY
    	,libelle VARCHAR(50) NOT NULL
    	,MasqueBit TINYINT
    )
    Et le jeu de test à partir de votre exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    INSERT INTO EVENEMENT (libelle, MasqueBit) VALUES
    ('ev1 (Samedi et Vendredi)', 65)
    ,('ev2 (Lundi, mardi et dimanche)', 7)
    Concernant votre problème, je me fendrai d'une table des jours, qui rendra vos requêtes plus simples :
    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
     
     
    CREATE TABLE JOUR(
    	id TINYINT NOT NULL CONSTRAINT PK_JOU PRIMARY KEY 
    	,Libelle VARCHAR(8)
    	)
     
    INSERT INTO JOUR(id, libelle) VALUES
    (1,'Dimanche')
    ,(2,'Lundi')
    ,(4,'Mardi')
    ,(8,'Mercredi')
    ,(16,'Jeudi')
    ,(32,'Vendredi')
    ,(64,'Samedi')
    Dès lors, il suffit de faire une jointure sur cette table avec les opérateurs bit à bit pour obtenir le résultat voulu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT E.libelle AS Evenement, J.Libelle AS Jour
    FROM EVENEMENT E
    INNER JOIN JOUR J
    	ON E.MasqueBit & J.id = J.id
    ORDER BY E.id
    Evenement			Jour
    ev1 (Samedi et Vendredi)	Dimanche
    ev1 (Samedi et Vendredi)	Samedi
    ev2 (Lundi, mardi et dimanche)	Dimanche
    ev2 (Lundi, mardi et dimanche)	Lundi
    ev2 (Lundi, mardi et dimanche)	Mardi
    
    On constate d'ailleurs qu'il y a une erreur dans votre exemple, car 65 représente alors samedi(64) et dimanche (1)

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2005
    Messages : 311
    Par défaut
    Merci beaucoup , ça fait mon affaire

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

Discussions similaires

  1. SELECT avec 2 Tables
    Par FannyMae dans le forum Requêtes
    Réponses: 9
    Dernier message: 13/06/2011, 21h13
  2. Select avec 3 tables
    Par benjamine dans le forum SQL
    Réponses: 6
    Dernier message: 01/03/2011, 09h54
  3. requete select avec plusieurs tables
    Par samba2005kanoute dans le forum Forms
    Réponses: 30
    Dernier message: 12/04/2007, 15h46
  4. Pb de syntaxe : Select avec plusieurs tables
    Par roxxxy dans le forum Requêtes
    Réponses: 6
    Dernier message: 27/03/2007, 11h34
  5. fonctions stockées avec une table en argument
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/10/2004, 23h17

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