Somme de valeur selon id inférieur

Fermé
bibimul Messages postés 31 Date d'inscription mercredi 6 décembre 2017 Statut Membre Dernière intervention 18 mars 2022 - 2 oct. 2020 à 16:22
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 - 5 oct. 2020 à 15:36
Bonjour,

je travail dans une base de données SQlite.
J'ai créé actuellement le code suivant:
import sqlite3
connexion = sqlite3.connect("test.sqlite")
curseur=connexion.cursor()
curseur.execute('''CREATE TABLE IF NOT EXISTS point(etat INTEGER, Est REAL, Nord REAL, DEst REAL, DNord REAL)''')
donnees=[(0,2577817.4240,1227151.7845,0.0,0.0),(1,2577817.425,1227151.784,1.0,-0.5),(2,2577817.420,1227151.784,-4.0,-0.5),(3,2577817.4210,1227151.7840,-3.0,-0.5),(4,2577817.4210,1227151.7830,-3.0,-1.5),(5,2577817.4240,1227151.7830,0.0,-1.5),(6,2577817.4209,1227151.7823,-3.1,-2.2),(7,2577817.4210,1227151.7820,-3.0,-2.5),(8,2577817.4170,1227151.7830,-7.0,-1.5)]
for donnee in donnees:
	curseur.execute('''INSERT INTO point(etat, Est, Nord, DEst, DNord) VALUES (?, ?, ?, ?, ?)''', donnee)
	connexion.commit()

listColReal=('Coord_plani_E',  'Coord_plani_N')
listColText=('Vecteur', 'WKT_Plani')
for i in listColReal:
	curseur.execute('''ALTER TABLE point ADD COLUMN %s REAL''' % i)
	connexion.commit()

for i in listColText:
	curseur.execute('''ALTER TABLE point ADD COLUMN %s TEXT''' % i)
	connexion.commit()


Si on imagine que je veux remplir la colonne "Coord_planni_E" en additionnant la colonne EST de l'ID inférieur et la colonne DEst de l'ID actuelle comment je peux faire ça?

Merci d'avance

3 réponses

yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
2 oct. 2020 à 17:26
bonjour, peux-tu expliciter ce que tu entends par "ID"?
ne peux-tu pas réaliser cela dans la boucle d'insertion?
il est, en général, déconseillé d'enregister des champs calculés.
dans quel contexte fais-tu ce travail?
0
bibimul Messages postés 31 Date d'inscription mercredi 6 décembre 2017 Statut Membre Dernière intervention 18 mars 2022
5 oct. 2020 à 07:46
bonjour,

alors pour l'ID j'entends ça comme le numéro de référence du point.
Au fur et à mesure que j'enregistre mes points dans mon Sqlite, un champ est créé avec un identifiant unique. Mais ça peut être aussi un autre champ.

Je fais ce travail pour créer un plugin sur QGIS qui me permette d'importer automatiquement un rapport après mesure. Donc je fais des mesures sur un chantier, j'ai un rapport avec des points et des écarts et j'aimerais maintenant importer ce rapport automatiquement.
Donc j'ai quelque calcul à faire en fonction d'étape.
Au final le but c'est d'obtenir des vecteur en chaque étape. Et pour ça j'aurais besoin de faire des calculs entre ces étapes.
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
5 oct. 2020 à 11:16
je propose que tu ajoutes le champ qui sert d'ID, puis que tu reviennes vers nous.
0
bibimul Messages postés 31 Date d'inscription mercredi 6 décembre 2017 Statut Membre Dernière intervention 18 mars 2022
5 oct. 2020 à 11:29
Bin en l'occurence le champ qui sert d'ID c'est "etat"
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471
5 oct. 2020 à 13:08
bin alors, supposant que tu n'importes pas toutes tes données dans l'ordre et en une seule fois, tu peux utiliser cette requête pour obtenir le résultat attendu. il est inutile, je pense, d'enregistrer
Coord_planni_E
dans une table.
select pa.etat, pa.Est, pa.Nord, pa.DEst, pa.DNord, pi.DEst as Coord_planni_E
    from point as pi,
    (select p1.etat, p1.Est, p1.Nord, p1.DEst, p1.DNord, max(p2.etat) as inferieur
    from point as p1, point as p2
    where p2.etat < p1.etat
    group by p1.etat) as pa
    where pi.etat=inferieur
0
jee pee Messages postés 39582 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 17 avril 2024 9 225 > yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024
5 oct. 2020 à 13:24
Bonjour,

j'avais compris : coord_planni_E = DEST + EST(n-1)

donc dans ta requete
pa.DEst+pi.Est as Coord_planni_E  
  .


j'ai celle là à proposer :
select a.etat, a.dest, b.etat, b.est, a.dest + b.est as result
from point as a
join point as b 
where b.etat = (select max(etat) from point where etat < a.etat)
0
yg_be Messages postés 22698 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 18 avril 2024 1 471 > jee pee Messages postés 39582 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 17 avril 2024
5 oct. 2020 à 15:36
en effet, plus correct et plus simple.
0