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

Sybase Discussion :

comment faire requête qui boucle sur le résultat d'une autre req


Sujet :

Sybase

  1. #1
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut comment faire requête qui boucle sur le résultat d'une autre req
    Bonjour TLM,

    j'ai une base de données SyBase qui tourne sous UNIX,

    je me conecte depuis putty sur cette BD pour en tirer des données ou enregistrements

    je veux faire une requête SQL (j'accéde via isql ....) pour ca :

    ma table : TAB
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    champ_1----champ_2
    --A1---------1001
    --A1---------1001
    --A1---------1002
    --A1---------1011
    --A1---------2013
    --A2---------1001
    --A2---------1001
    --A2---------1002
    --A2---------1005
    --A3---------1001
    --A3---------1005
    donc je veux un résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    champ_1----champ_2----champ_3_nb
    --A1---------1001----------2-------
    --A1---------1002----------1-------
    --A1---------1011----------1-------
    --A1---------2013----------1-------
    --A2---------1001----------2-------
    --A2---------1002----------1-------
    --A2---------1005----------1-------
    --A3---------1001----------1-------
    --A3---------1005----------1-------
    voilà,

    donc un truc de requête qui boucle sur le résultat d'une autre requête !
    avec Sybase, j'arrive pas a trouver comment faire tourner une requête qui boucle sur le résultat d'une autre

    si quelqu'un peux m'aiderpour ca, merci d'avance

  2. #2
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut
    Bonjour

    je pense que tu dois pouvoir utiliser un curseur pour ton probleme
    Voici un exemple :

    declare Liste_Tables cursor for
    (
    select name from sysobjects where type='U'
    )

    declare @NomTable varchar(40)
    open Liste_Tables
    fetch Liste_Tables into @NomTable

    while (@@sqlstatus = 0)
    begin

    if (select count(*) from Exploit_Nis..TABLES where NOM_BASE = @db_name and NOM_TABLE = @NomTable) = 0
    begin
    insert Exploit_Nis..TABLES values ( @NomTable, @db_name )
    end

    fetch Liste_Tables into @NomTable
    end

    close Liste_Tables



    jeeps64

  3. #3
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    merci pour ta réponse,

    mais en tant que débutant avec SyBase, je vois ta solution est un peu compliqué pour moi !!

    je sais pas s'il y'en a une autre solution purement requête SQL plus raisonable a mes connaissances SyBase.

    merci pour ta solution que je l'a prends en considération malgré tout

  4. #4
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut
    Ma reponse fut un epu rapide et inadaptée ce matin

    Voici la requete qui devrait resoudre ta demande :

    select champ_1,champ_2,count(*) as champ_3 from TAB group by champ_1,champ_2


    jeeps64

  5. #5
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    coool ca marche comme je le souhaite 1000 et 1000 merci



    juste un truc, y'a t'il un moyen d'en tirer la somme dans l'affichage pour le champs : champ_2_nb

    c'est a dire avoir ce résultat :

    [ CODE]
    champ_1----champ_2----champ_3_nb
    --A1---------1001----------2-------
    --A1---------1002----------1-------
    --A1---------1011----------1-------
    --A1---------2013----------1-------

    TOTAL----------------------5-------

    --A2---------1001----------2-------
    --A2---------1002----------1-------
    --A2---------1005----------1-------

    TOTAL----------------------4------

    --A3---------1001----------1-------
    --A3---------1005----------1-------

    TOTAL----------------------2-------

    TOTAL_GENERALE-----------11------

    [/CODE]

    sachant que TOTAL_GENERALE = somme des totaux

    et merci d'avance

    PS : je fesais ca en ORACLE mais en Sybase, aucune idée !!!

  6. #6
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    desolé pour mettre l'exemple entre c'est a dire avoir ce résultat :

    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
     
    champ_1----champ_2----champ_3_nb
    --A1---------1001----------2-------
    --A1---------1002----------1-------
    --A1---------1011----------1-------
    --A1---------2013----------1-------
     
    TOTAL----------------------5-------
     
    --A2---------1001----------2-------
    --A2---------1002----------1-------
    --A2---------1005----------1-------
     
    TOTAL----------------------4------
     
    --A3---------1001----------1-------
    --A3---------1005----------1-------
     
    TOTAL----------------------2-------
     
    TOTAL_GENERALE-----------11------
    sachant que TOTAL_GENERALE = somme des totaux

    et merci d'avance

    PS : je fesais ca en ORACLE mais en Sybase, aucune idée !!!

  7. #7
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut
    directement, je ne vois pas
    mais je ne suis pas un expert du developpement SQL
    La seule chose que je peux te proposer, c'est un mix entre :

    select champ_1,count(*) as TOTAL from TAB group by champ_1
    et
    la commande precedente

    dans une procedure stockée par exemple

    jeeps64

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    On peut utiliser une extension de Transact-SQL pour cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select col1, col2, count(*)
      from tab
     group by col1, col2
     order by col1, col2
    compute sum(count(*)) by col1
    compute sum(count(*))
    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  9. #9
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    merci infiniment pour les réponses

    ma question maintenant est si j'ai

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    champ_1----champ_2----champ_date
    --A1---------1001------01/01/2007
    --A1---------1001------Null-----
    --A1---------1002------Null-----
    --A1---------1011------03/02/2007
    --A1---------2013------03/02/2007
    --A2---------1001------03/02/2007
    --A2---------1001------Null
    --A2---------1002------Null
    --A2---------1005------Null
    --A3---------1001------01/03/2007
    --A3---------1005------12/04/2007
    ou le champ_date contient ceux qui sont actif (date d'activation).

    donc je veux avoir ce résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    champ_1----champ_2----champ_3_nb------nb_actif
    --A1---------1001----------2----------------1
    --A1---------1002----------1----------------0
    --A1---------1011----------1----------------1
    --A1---------2013----------1----------------1
    --A2---------1001----------2----------------1
    --A2---------1002----------1----------------0
    --A2---------1005----------1----------------0
    --A3---------1001----------1----------------1
    --A3---------1005----------1----------------1
    donc nb_actif contient le nombre activé (date différent de Null)

    est il possible pour ca ?

    thanks en advance

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Je suggère un bon bouquin sur le SQL...

    En attendant, pour compter le nombre de ligne qui ont le champ "date" à non-null, tu peux faire qqch comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select ..., sum( case when date_col is null then 0 else 1 end)
    from ...
    where ...
    group by ...
    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  11. #11
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    wow, cool ca marche formidablement, merci

    juste une dernière chose qui concerne le compute, comment utiliser un compute avec un nom choisi

    comme le truc coun (*) as nombre, comment faire ca avec compute

    exemple :

    compute sum(count(*)) BY sdpID as somme_client

    est t'il possible ? et merci encore

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Je ne pense pas que ce soit possible, parce que le compute by est une fonction assez spéciale.

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  13. #13
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    Ok, merci pour ta réponse,

    et pour conclure ce sujet, je veux avoir un autre champs qui contient le pourcentage,

    c'est a dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    champ_1----champ_2----champ_3_nb------nb_actif-----pourcentage%
    --A1---------1001----------2----------------1-----------50-------
    --A1---------1002----------1----------------0------------0--------
    --A1---------1011----------1----------------1-----------100------
    --A1---------2013----------1----------------1-----------100------
    --A2---------1001----------2----------------1------------50------
    --A2---------1002----------1----------------0-------------0------
    --A2---------1005----------1----------------0------------0------
    --A3---------1001----------1----------------1------------100----
    --A3---------1005----------1----------------1------------100----
    et merci une autre fois a tout le monde

  14. #14
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Le pourcentage se calcule sur la base des deux autres colonnes - ce n'est pas très difficile à faire vu que les opérateurs arithmetiques habituels existent en SQL... je pense que là tu devrais pouvoir t'en sortir en réflechissant cinq minutes!

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  15. #15
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    Salut,

    je vous montre ma requête, j'ai essayé mais ca n'a pas donner de résultat !!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    Select sdpID as SDP, ServiceClassID as Service_Class, count (*) as Nb_Subs, 
     
    sum (case when ActivationDate IS NULL then 0 else 1 end) as Actif_Subs,
    sum (case when ActivationDate IS NULL then 1 else 0 end) as Non_Actif_Subs,
     
    from Account
     
    Where sdpID = 'SDP01'
    group by sdpID, ServiceClassID
    Order By sdpID, ServiceClassID
    ce que je veux faire est une colonne qui contient la division de chaque valeur de (Actif_Subs) par (Nb_Subs) le résultat *100 pour avoir le pourcentage !!

    donc champs_%_actif = [ (Actif_Subs) / (Nb_Subs) ] *100

    et de même pour un autre champs pourcentage :

    champs_%_inactif = [ (Non_Actif_Subs) / (Nb_Subs) ] *100

    voilà, j'ai essayé avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    
    { (sum (case when ActivationDate IS NULL then 0 else 1 end)) / Nb_Subs) * 100 }
    mais ca n'a pas marché !!!

  16. #16
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    On ne peut pas utiliser les alias de colonne dans la requête elle-même.

    Essaye ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select ..., (convert(float, sum(case when ActivationDate is null then 0 else 1 end))/count(*) * 100)
    from ...
    where ...
    group by ...
    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  17. #17
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    cool, ca marche trés bien a part que j'ai 5 chiffres a aprés la virgule,

    j'ai utiliser FLOAT(3,2) mais il n'a ps accepté ca, erreur !!!

    comment puis je avoir que 2 chiffres aprés la virgule ?

    et pkoi dans l'affichage, sa saute les lignes pour la dernière colonne => mauvais afichage de mon résultat !!!

    exemple :

    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
     
     SDP      Service_Class Nb_Subs     Actif_Subs  Non_Actif_Subs
             prctge_actif
     -------- ------------- ----------- ----------- --------------
             --------------------
     SDP01             1001      336980      322613          14367
                        95.736542
     SDP01             1002           4           2              2
                        50.000000
     SDP01             1003       12481       12409             72
                        99.423126
     SDP01             1004          12          11              1
                        91.666672
     SDP01             1005      168780      168780              0
                       100.000000
     SDP01             1006           2           2              0
                       100.000000
     SDP01             1313           1           1              0
                       100.000000

  18. #18
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Pour la précision, voir la liste des fonctions T-SQL disponible ici:

    http://infocenter.sybase.com/help/to...s/blocks75.htm

    Pour la largeur de l'affichage cela dépend du client qui est utilisé. Si il s'agit d'isql, alors il faut utiliser -w100 (line wrap à 100 charactères, p.ex.)

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

  19. #19
    Membre du Club
    Inscrit en
    Septembre 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 79
    Points : 41
    Points
    41
    Par défaut
    Salut,

    comment avoir que deux chiffres aprés la virgule ?

    et merci

  20. #20
    Membre chevronné

    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 307
    Détails du profil
    Informations personnelles :
    Âge : 64
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 307
    Points : 1 828
    Points
    1 828
    Par défaut
    Je t'invite à lire la documentation des fonctions disponibles dans Transact-SQL, comme par exemple round(), str() et convert() (voir le liens vers la doc Sybase dans mon message précédent)

    Michael
    Michael Peppler
    Membre de TeamSybase - www.teamsybase.com

    "A successful [software] tool is one that was used to do something undreamed of by its author." -- S. C. Johnson

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [ODBC] Exécuter une requête sur le résultat d'une autre
    Par che0po dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 14/05/2012, 12h29
  2. Comment faire boucler un job sur le résultat d'une requête SQL ?
    Par galadorn dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 27/04/2011, 12h42
  3. Requête SQL sur le résultat d'une autre requête
    Par rec82 dans le forum Bases de données
    Réponses: 10
    Dernier message: 12/12/2008, 18h40
  4. Réponses: 2
    Dernier message: 11/06/2007, 17h40
  5. requête qui boucle sur une autre requête
    Par super_dz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/09/2006, 21h02

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