Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Printemps des cartes 2024

#1 Tue 09 August 2011 18:15

cyrille
Participant assidu
Date d'inscription: 7 Feb 2006
Messages: 387

[spatialite] colle SQL

Bonsoir,
j'ai un fichier qui ressemble à ca:

VILLE    Info
ACHERES     000000000
ACHERES     000000000
ACHERES     000000000
ACHERES     000000000
ACHERES     000000000
ACHERES     000000000
ACHERES     010000000
ACHERES     100000000
ACHERES     100000000
ACHERES     100100100


avec ville par ville des infos, j'ai besoin d'arriver à ca

VILLE    Info               Results

ACHERES     000000000     60%
ACHERES     010000000     10 %
ACHERES     100000000     20 %
ACHERES     100100100     10%

ce qui se lirait de la maniere suivante, pour la ville de achere le cas de figure 000000000 se retrouve dans 60 % des cas, le cas 010000000  dans 10 % etc...

est ce que vous auriez une idee de l'outil capable de faire ca? je dispose de spatialite, access, excel qgis mais pas oracle.

j'ai pensé aux tableaux croisés dynamiques sous excel mais je n'ai pas une mais une tripotées de villes et j'aimerai garder les 3 cas de figures les plus importants

smile

avez vous une idée? merci!

Dernière modification par cyrille (Wed 10 August 2011 09:13)

Hors ligne

 

#2 Tue 09 August 2011 18:41

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: [spatialite] colle SQL

En sql, quelque chose du genre :

Code:

SELECT VILLE, INFO,
CUME_DIST() OVER ( PARTITION BY VILLE ORDER BY
count(distinct(INFO))
AS Results
FROM 
GROUP BY VILLE,INFO

Facile ?


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#3 Tue 09 August 2011 19:05

cyrille
Participant assidu
Date d'inscription: 7 Feb 2006
Messages: 387

Re: [spatialite] colle SQL

Merci ! j'essaie de lancer la requete sous spatialite -conecté a qgis-

et ca ne semble pas passer sad

j'ai bien adapté la requete

il manque la table derriere le from non?

la fonction CUME_DIST()

ne semble pas etre dispo sous spatialite

OVER ( PARTITION BY VILLE ORDER BY
count(distinct(INFO)) m'echappe completement smile

Dernière modification par cyrille (Tue 09 August 2011 19:07)

Hors ligne

 

#4 Tue 09 August 2011 19:43

Pierre
DesCartesPourUnMondeMeilleur
Date d'inscription: 22 Sep 2005
Messages: 1643

Re: [spatialite] colle SQL

Je ne connaissais pas le nom de la table.
Ajoutez Spatialite dans le nom du sujet, sans cela tous les utilisateurs d'Oracle risquent de vous répondre avec des fonctions propres à Oracle. Je ne connais malheureusement pas l'équivalent de cette fonction dans spatialite hmm.


art X I. Déclaration des Droits de l’Homme et du Citoyen 1789
La libre communication des pensées et des opinions est un des droits les plus précieux de l’Homme : tout Citoyen peut donc parler, écrire, imprimer librement, sauf à répondre de l’abus de cette liberté, dans les cas déterminés par la Loi.

Hors ligne

 

#5 Wed 10 August 2011 11:50

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [spatialite] colle SQL

cyrille a écrit:

Bonsoir,
j'ai un fichier qui ressemble à ca:

VILLE    Info
ACHERES     000000000
ACHERES     000000000
ACHERES     000000000
ACHERES     000000000
ACHERES     000000000
ACHERES     000000000
ACHERES     010000000
ACHERES     100000000
ACHERES     100000000
ACHERES     100100100


avec ville par ville des infos, j'ai besoin d'arriver à ca

VILLE    Info               Results

ACHERES     000000000     60%
ACHERES     010000000     10 %
ACHERES     100000000     20 %
ACHERES     100100100     10%

ce qui se lirait de la maniere suivante, pour la ville de achere le cas de figure 000000000 se retrouve dans 60 % des cas, le cas 010000000  dans 10 % etc...

est ce que vous auriez une idee de l'outil capable de faire ca? je dispose de spatialite, access, excel qgis mais pas oracle.

j'ai pensé aux tableaux croisés dynamiques sous excel mais je n'ai pas une mais une tripotées de villes et j'aimerai garder les 3 cas de figures les plus importants

smile

avez vous une idée? merci!


Bonjour,

quelque chose comme:

Code:

select t.ville, t.info, (cast(count(info) as real) / t2.cnt) * 100
from test t,
(select ville, cast(count(ville) as real) as cnt from test group by ville) as t2
where t2.ville = t.ville
group by info
order by t.ville;

sur une table ressemblant a ca:

Code:

ACHERES        000000000
ACHERES        000000000
ACHERES        000000000
ACHERES        000000000
ACHERES        000000000
ACHERES        000000000
ACHERES        010000000
ACHERES        100000000
ACHERES        100000000
ACHERES        100100100
agen        0000000
agen        0000000
agen        00000011000000011
agen        00000011000000011
agen        00000011000000011
agen        00000011100000011

Donne le resultat suivant:

Code:

ACHERES        000000000                60
ACHERES        010000000                10
ACHERES        100000000                20
ACHERES        100100100                10
agen        0000000                    33.33333333333333
agen        00000011000000011        50
agen        00000011100000011        16.666666666666664

les fonctions dont parlait Pierre, couplées à l'utilisation de la clause OVER (PARTITION BY...) sont des Windowing functions, ou ranking functions  (suivant les bases). C'est tres puissant pour faire des stats ou des classements de ses données.

Postgresql supporte ces fonctions depuis la version 8.4.

Un article interessant a ce sujet: http://database-programmer.blogspot.com … ction.html

Nicolas

Dernière modification par Nicolas Ribot (Wed 10 August 2011 12:49)

Hors ligne

 

#6 Wed 10 August 2011 12:00

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [spatialite] colle SQL

(bon, pardon pour la mise en page, je suis nul en indentation yikes)

Dernière modification par Nicolas Ribot (Wed 10 August 2011 12:01)

Hors ligne

 

#7 Wed 10 August 2011 14:52

cyrille
Participant assidu
Date d'inscription: 7 Feb 2006
Messages: 387

Re: [spatialite] colle SQL

Merci pour votre aide precieuse

J'ai demonté la requête en 2

select ville, cast(count(ville) as real) as cnt from test group by ville

fonctionne bien avec ville un group by ville dans une colonne et le nombre d'enregistrement dans l'autre

ensuite si je lance la requete en entier, je n'obtient qu'un seul enregistrement. je continue a chercher.

Hors ligne

 

#8 Fri 12 August 2011 21:27

ThomasG
Membre
Lieu: Nantes
Date d'inscription: 9 Sep 2005
Messages: 943
Site web

Re: [spatialite] colle SQL

Bonsoir,

Même si de nouvelles fonctions spécifiques existent par exemple dans PostgreSQL ou Oracle comme signalé par Pierre et Nicolas, je préfère souvent repartir de la base (a priori vous débutez en SQL)

Les étapes que j'ai suivi sont les suivantes :

-Grouper pour compter par ville et par type de résultat info

Code:

SELECT ville,info,count()
AS resultvi
FROM test
GROUP BY ville, info

-Grouper pour compter par ville seulement

Code:

SELECT ville,count()
AS resultv
FROM test
GROUP BY ville

Maintenant vous avez deux résultats : d'une part, le nombre total de résultats par ville et d'autre part, le nombre de résultat par ville pour chaque type d'info.
Il vous reste à diviser l'un par l'autre en faisant attention au type en faisant un cast qui est la déclaration d'un type pour une colonne considérée (les count renvoient des entiers et il vous faut des nombres à virgule REAL) et en effectuant une jointure
Le résultat est au choix (les deux syntaxes suivantes sont justes)

Code:

select tv.ville, tvi.info, resultvi, resultv, CAST(resultvi AS REAL) / CAST(resultv AS REAL)*100 from (SELECT ville, count() AS resultv FROM test GROUP BY ville) as tv, 
(SELECT ville, info, count() AS resultvi FROM test GROUP BY ville, info) as tvi
where tv.ville = tvi.ville

Code:

select tv.ville, tvi.info, resultvi, resultv, CAST(resultvi AS REAL) / CAST(resultv AS REAL)*100 from (SELECT ville, count() AS resultv FROM test GROUP BY ville) as tv JOIN (SELECT ville, info, count() AS resultvi FROM test GROUP BY ville, info) as tvi ON (tv.ville = tvi.ville)

Vous trouverez en pièce jointe le fichier csv utilisé et à charger dans spatialite en tant que csv/txt. Pour info, le séparateur de texte est le guillemet double, le séparateur de colonne le point virgule, l'encodage n'est pas important car on a pas d'accent dans notre fichier de test, le séparateur de décimal n'a pas nom plus d'importance car on n'importe pas des données décimales.

Cordialement

ThomasG

PS: Si vous ne l'avez pas consulté, allez voir le cookbook spatialite qui est bien fait http://www.gaia-gis.it/spatialite-2.4.0 … okbook-fr/


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

#9 Tue 16 August 2011 11:23

cyrille
Participant assidu
Date d'inscription: 7 Feb 2006
Messages: 387

Re: [spatialite] colle SQL

Bonjour Thomas, merci pour le temps que tu as passé pour ce petit tuto! ca fonctionne tres bien.
Y t'il moyen de ne garder que les 3 plus gros pourcentage simplement? sinon pas grave cette reponse me va.
Merci!

Dernière modification par cyrille (Tue 16 August 2011 11:24)

Hors ligne

 

#10 Tue 16 August 2011 11:44

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1536

Re: [spatialite] colle SQL

cyrille a écrit:

Bonjour Thomas, merci pour le temps que tu as passé pour ce petit tuto! ca fonctionne tres bien.
Y t'il moyen de ne garder que les 3 plus gros pourcentage simplement? sinon pas grave cette reponse me va.
Merci!


Bonjour,

oui, il y a moyen: SQLite supporte l'opérateur LIMIT:


select * from table limit 3; (par exemple)

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB