Précédent   Forum des professionnels en informatique > Bases de données > Sybase
Sybase Forum sur la base de données Sybase. Avant de poster -> F.A.Q Sybase, Tutoriels Sybase
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/05/2007, 11h33   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 73
Points : 12
Points : 12
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 :
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 :
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
super_dz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 13h12   #2
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 14h53   #3
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 73
Points : 12
Points : 12
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
super_dz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 15h14   #4
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 16h45   #5
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 73
Points : 12
Points : 12
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 !!!
super_dz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 16h47   #6
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 73
Points : 12
Points : 12
desolé pour mettre l'exemple entre c'est a dire avoir ce résultat :

Code :
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 !!!
super_dz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 17h16   #7
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/05/2007, 18h10   #8
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
On peut utiliser une extension de Transact-SQL pour cela:
Code :
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2007, 17h36   #9
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 73
Points : 12
Points : 12
merci infiniment pour les réponses

ma question maintenant est si j'ai

Code :
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 :
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
super_dz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2007, 08h25   #10
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
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 :
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2007, 14h01   #11
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 73
Points : 12
Points : 12
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
super_dz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 13h37   #12
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 14h14   #13
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 73
Points : 12
Points : 12
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 :
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
super_dz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 18h31   #14
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 12h29   #15
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 73
Points : 12
Points : 12
Salut,

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

Code :
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 :
1
2
3

{ (sum (case when ActivationDate IS NULL then 0 else 1 end)) / Nb_Subs) * 100 }
mais ca n'a pas marché !!!
super_dz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 14h58   #16
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
On ne peut pas utiliser les alias de colonne dans la requête elle-même.

Essaye ceci:

Code :
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 16h20   #17
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 73
Points : 12
Points : 12
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 :
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
super_dz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 17h48   #18
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 13h25   #19
Candidat au titre de Membre du Club
 
Inscription : septembre 2006
Messages : 73
Détails du profil
Informations forums :
Inscription : septembre 2006
Messages : 73
Points : 12
Points : 12
Salut,

comment avoir que deux chiffres aprés la virgule ?

et merci
super_dz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 13h29   #20
Rédacteur/Modérateur
 
Inscription : janvier 2006
Messages : 1 301
Détails du profil
Informations personnelles :
Âge : 52

Informations forums :
Inscription : janvier 2006
Messages : 1 301
Points : 1 505
Points : 1 505
Envoyer un message via AIM à mpeppler
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
mpeppler est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h17.


 
 
 
 
Partenaires

Hébergement Web