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

SQL Oracle Discussion :

Est ce possible ?


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut Est ce possible ?
    Bonjour,

    je suis confronté au probleme suivant et je ne voit pas comment le resoudre sans passer par un curseur...

    J'ai la table suivante

    No_WEEK | ID | FLG
    ------------------------
    1 |1 | 0
    2 |1 | 1
    3 |1 | 1
    4 |1 | 0
    1 |2 | 1
    2 |2 | 0
    3 |2 | 0

    et je souhaiterais pouvoir sortir le resultat suivant:

    ID | RES
    -----------------------------
    1 | 0110000000
    2 | 1000000000

    Ou res contient par NO_WEEk le resultat du FLAG et en plus il faudrait que padder avec des 0 jusqu'à 10 (bon cette partie là ca irait encore un bon vieut RPAD et c'est bon...


    Quelqu'un aurait une idée ???

    merci beaucoup d'avance pour le temps que vous prenez à bien vouloir me répondre !!!

  2. #2
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862

  3. #3
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Ici, si j'ai bien compris, tu peux essayer un petit truc marrant :
    La position de ton bit est déterminée par le NO_WEEK.
    Est-ce que ça ne correspond pas exactement à FLAG * 10 ^(10 - NO_WEEK +1) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id, sum(FLAG * pow(10, 10 - NO_WEEK + 1)) AS res
    FROM TaTable
    GROUP BY id

  4. #4
    Membre averti
    Inscrit en
    Novembre 2008
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 14
    Par défaut
    Citation Envoyé par pacmann Voir le message
    Salut !

    Ici, si j'ai bien compris, tu peux essayer un petit truc marrant :
    La position de ton bit est déterminée par le NO_WEEK.
    Est-ce que ça ne correspond pas exactement à FLAG * 10 ^(10 - NO_WEEK +1) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id, sum(FLAG * pow(10, 10 - NO_WEEK + 1)) AS res
    FROM TaTable
    GROUP BY id

    Oui c'est tout a fait ca que j'avais besoin ! C'est vraiment pas con ton idée ! Merci !

    Et merci à MCM pou rle petit correctif pour la fonction power et le padding.

    Par contre vu que mon nombre d'ID est de l'ordre de 500000 les unions ne sont pas jouables mais merci en tout cas !!!

    Et merci à Waldar pour le recap !


  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Non, le union n'a rien à voir avec la requête. C'est juste pour créer une table temporaire. J'ai pas envie de faire un create table puis des insert, puis un drop table. Et ça a l'avantage que tout le monde peut reprendre la requête pour qu'on travaille sur les mêmes données

    Tu as donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id, to_char(sum(flg * power(10, 10 - w + 1)), '00000000000') AS res
    FROM TaTable
    GROUP BY id
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id, LPAD(sum(flg * power(10, 10 - w + 1)), 10, '0') AS res
    FROM TaTable
    GROUP BY id
    ou
    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
    SELECT ID, RPAD(CONCAT, 10, '0') AS result
    FROM (
    	SELECT ID, row_number() OVER (PARTITION BY ID ORDER BY w) AS num,
    				flg
    					 || lead(flg, 1) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 2) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 3) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 4) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 5) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 6) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 7) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 8) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 9) OVER (PARTITION BY ID ORDER BY w) AS CONCAT
    	FROM tatable
    		)
    WHERE num = 1

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    D'ailleurs je viens de tester, c'est faux Pacmann et Waldar !
    Vous avez un 0 de trop à droite !
    C'est 10 - w et pas 10 - w +1
    et to_char(..., '0x10') et pas '0x11'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT ID, LPAD(SUM(flg * POWER(10, 10 - w )), 10, '0') AS res
    FROM TaTable
    GROUP BY ID
    car
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT POWER(10,9)
    FROM dual
     
    1000000000 : 10 de long

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Si ton nombre de données est limité (vu que tu fais un pad de 10, je le pense), tu peux le faire "simplement" en 9i avec les fct analytiques
    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
    WITH t AS ( SELECT 1 w, 1 ID, 0 flg FROM dual
    UNION ALL  SELECT 2 w, 1 ID, 1 flg FROM dual
    UNION ALL  SELECT 3 w, 1 ID, 1 flg FROM dual
    UNION ALL  SELECT 4 w, 1 ID, 0 flg FROM dual
    UNION ALL  SELECT 1 w, 2 ID, 1 flg FROM dual
    UNION ALL  SELECT 2 w, 2 ID, 0 flg FROM dual
    UNION ALL  SELECT 3 w, 2 ID, 0 flg FROM dual
    )
    SELECT ID, RPAD(CONCAT, 10, '0') AS result
    FROM (
    	SELECT ID, row_number() OVER (PARTITION BY ID ORDER BY w) AS num,
    				flg
    					 || lead(flg, 1) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 2) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 3) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 4) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 5) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 6) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 7) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 8) OVER (PARTITION BY ID ORDER BY w) 
    	         || lead(flg, 9) OVER (PARTITION BY ID ORDER BY w) AS CONCAT
    	FROM t
    		)
    WHERE num = 1
     
    ID	RESULT
    1	0110000000
    2	1000000000

  8. #8
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Pacman.

    Bon, c'est POWER et non pas POW la fonction à utiliser, et il faut rajouter un rpad, mais à gauche, cette fois ci.

  9. #9
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Zut, le pad !

    Tiens, et tochar(lemachin, '0000000000'), ça peut marcher ?

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Oui ça fonctionne très bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH TaTable AS
    (
               SELECT 1 w, 1 ID, 0 flg FROM dual
    UNION ALL  SELECT 2 w, 1 ID, 1 flg FROM dual
    UNION ALL  SELECT 3 w, 1 ID, 1 flg FROM dual
    UNION ALL  SELECT 4 w, 1 ID, 0 flg FROM dual
    UNION ALL  SELECT 1 w, 2 ID, 1 flg FROM dual
    UNION ALL  SELECT 2 w, 2 ID, 0 flg FROM dual
    UNION ALL  SELECT 3 w, 2 ID, 0 flg FROM dual
    )
    SELECT id, to_char(sum(flg * power(10, 10 - w + 1)), '00000000000') AS res
    FROM TaTable
    GROUP BY id
    Le WITH est ©McM et le select ©Pacmann.

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

Discussions similaires

  1. Est-il possible de bloquer le reverse engineering ?
    Par fugi dans le forum Assembleur
    Réponses: 39
    Dernier message: 31/07/2007, 02h33
  2. [IRC] -> Est-ce possible avec JBuilder ?
    Par MaTHieU_ dans le forum JBuilder
    Réponses: 4
    Dernier message: 26/08/2003, 17h24
  3. Réponses: 3
    Dernier message: 29/07/2003, 09h38
  4. Réponses: 2
    Dernier message: 16/05/2003, 10h14
  5. [CR] Est il possible de créer des univers avec Seagate Info?
    Par Frank dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 27/06/2002, 15h22

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