Requête SQL

classic Classic list List threaded Threaded
7 messages Options
Reply | Threaded
Open this post in threaded view
|

Requête SQL

Nicolas F.
Administrator
J'ai deux tables tuple et Tronfil.

tuple a deux colonnes gid et IDOBJ (des indices)
Tronfil contient IDOBJ et des the_geom

Je cherche à faire la somme des longueur de tronfil pour les éléments lié à tuple pour le même gid. Donc j'ai la requête suivante :

select t.gid as gid,SUM(ST_Length(tr.the_geom)) as qvoie FROM tuple as t,Tronfil as tr WHERE t.IDOBJ = tr.IDOBJ;


Mais il me retourne l'erreur suivante "Semantic error in instruction:select t.gid as gid,SUM(ST_Length(tr.the_geom)) as qvoie FROM tuple as t,Tronfil as tr WHERE t.IDOBJ = tr.IDOBJ
Caused by: Field not found: t.gid"

Alors que t.gid existe bel est bien. Si j'enlève l'instruction SUM ca fonctionne bien mais avec bien-sûr des doublons dans la colonne gid.

Est-ce que ma requête sql est incorrecte ?
Reply | Threaded
Open this post in threaded view
|

Re: Requête SQL

Gwendall Petit
Administrator
Bonjour Nicolas,

A priori ta requête tient la route.
Je me pose néanmoins une question par rapport à la fonction SUM. Comme tu le sais, il s'agit d'une fonction agrégative. Donc si tu as plusieurs IDOBJ pour un gid ou inversement, je pense que tu vas devoir faire appel à un GROUP BY.

Pour être certain de ce que j'avance, aurais-tu un jeu de données à me transmettre ?

PS : J'ai déplacé ton post dans la partie "User".
Reply | Threaded
Open this post in threaded view
|

Re: Requête SQL

Nicolas F.
Administrator
Bonjour

Ah oui tu as raison. J'ai complétement zappé le group by. Du coup ca fonctionne très bien maintenant :

select t.gid as gid,SUM(ST_Length(tr.the_geom)) as qvoie FROM tuple as t,Tronfil as tr WHERE t.IDOBJ = tr.IDOBJ GROUP BY t.gid;

merci beaucoup
Reply | Threaded
Open this post in threaded view
|

Re: Requête SQL

KatiaC
In reply to this post by Gwendall Petit
Bonjour,

Je cherche à calculer la densité de surface d'eau dans un maillage (maillage_newdom). J'ai calculé la surface d'eau dans les mailles en contenant (Surfwater) et j'en déduis la densité de surface (density_water). Mais j'ai besoin de conserver l'info des mailles ne contenant pas d'eau (et mettre le champs density à 0). Voici donc ce que j'ai codé:

-- je calcule la densité de surface d'eau dans chaque maille
CREATE TABLE density_water AS SELECT a.the_geom, b.ID, a.surf/st_area(b.the_geom) as density  FROM Surfwater a, maillage_newdom b WHERE a.ID=b.ID;

-- je veux l'info sur tout le domaine (je veux garder les mailles où il n'y a pas d'eau)
-- je crée une nouvelle table équivalente au maillage
create TABLE density_water_maillage AS SELECT * FROM maillage_newdom;

--j'ajoute une colonne density pour que les tables density_water_maillage et density water aient les mêmes champs
ALTER TABLE density_water_maillage ADD COLUMN density double;

--j'initialise la colonne density à 0
UPDATE density_water_maillage SET density=0;

-- je concatène les tables density_water_maillage et density_water
INSERT INTO density_water_maillage select * from density_water;

-- je somme les champs density dans un champs densite pour les lignes en double
CREATE TABLE test AS SELECT ST_UNION(the_geom) as the_geom, ID, SUM(density) as densite from density_water_maillage GROUP BY ID;

C'est cette dernière commande qui ne fonctionne pas: je n'ai pas d'erreur mais le résultats est une table avec toujours les lignes en doublon...
Voyez-vous où est mon erreur???

Merci de votre aide.

Katia
Reply | Threaded
Open this post in threaded view
|

Re: Requête SQL

Gwendall Petit
Administrator
Bonjour Katia,

Je ne suis pas sûr d'identifier précisément ton problème, même si je suspecte une syntaxe étrange sur ton avant dernière instruction.

Quoi qu'il en soit, je viens de faire le test (avec la densité de bâti ... donc c'est la même chose).
Voici mon code :
-- La chouche density, comporte trois champs : the_geom, id, density

-- Copie de la couche de maillage
CREATE TABLE maillage_bis as SELECT the_geom, id FROM maillage;

-- Ajout d'un champ density pour avoir la même structure que ma table "density" (celle qui porte les stats sur les bâtiments)
ALTER TABLE maillage_bis ADD COLUMN density DOUBLE ;

-- Mise à jour de ce champ avec la valeur 0
UPDATE maillage_bis SET density=0;

-- Unification (pas au sens ST_UNION) des deux tables --> on les met bout à bout
CREATE TABLE table_union AS SELECT * FROM maillage_bis UNION SELECT * FROM density;

-- On regroupe les cellules lorsque les identifiants sont identiques. Au passage, on récupère la valeur MAX de la densité
CREATE TABLE table_distinct AS SELECT st_union(the_geom) as the_geom, id, MAX(density) as density FROM table_union GROUP BY id;
ça tourne bien sur ma machine. J'espère que ça te permettra de résoudre ton problème.

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Requête SQL

KatiaC
Bonjour Gwendall,

Tu avais raison, même si je n'avais aucun message d'erreur, la commande insert to ... posait apparemment problème. Car lorsque je ne change que cette commande par la tienne utilisant UNION, ça marche beaucoup mieux!

Quel talent!

Bises

Katia
Reply | Threaded
Open this post in threaded view
|

Re: Requête SQL

Gwendall Petit
Administrator
Parfait,

Content d'avoir pu résoudre ton problème.

Bonne journée

Gwendall