TrafMaxime
Messages postés288Date d'inscriptionmercredi 4 mai 2005StatutMembreDernière intervention26 janvier 2012
-
30 mai 2008 à 15:28
TrafMaxime
Messages postés288Date d'inscriptionmercredi 4 mai 2005StatutMembreDernière intervention26 janvier 2012
-
4 juin 2008 à 14:14
Bon salut les gars..
Je suis entrain de faire en bricolage assez couteux en temps, mais je suis sur que quelqu'un peu faire parler sa classe, et me donner une meilleur méthode.
Voilà le topo : je veux regrouper les champs d'une table ayant la même valeur dans une certaine colonne, schématiquement passer de :
x1 | y1 | z1
x1 | y2 | z2
x3 | y3 | z3
à :
x1 | y1 + y2 | z1 + z2
x3 | y3 | z3
Ne fuyez pas c'est un exercice de base, le problème c'est que j'ai pas l'impression d'employer la méthode la plus judicieuse, je fais :
1-écriture de toutes les données
2-"select distinct valeur from matable"
3-pour chaque valeur : "select matable.* where valeur like '"+ _ +"'"
4- Somme des éléments et destruction des lignes inutiles
Quelqu'un voit-il une meilleure solution ?
.Maytheforcebewithyou.Maxime.
A voir également:
Base de donnée : regroupement de champs (en ado.net)
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 30 mai 2008 à 18:59
Et non !
Agregation est plus ou moins synonyme de groupement.
Bref, dans le cas présent, lorsque tu utilise Group By, il doit porter sur tous les paramètres simples que tu as en résultat de ta requette.
En plus clair, ID et artikelnr sont des paramètres simples, ce sont des champs de ta table.
A contrario, sum(menge) est un champ complexe, en fait le résultat d'une formule de calcul.
Donc Group By doit porter sur ID et artikelnr :
Dim str As String = "Select ID, artikelnr, sum(menge) from sigma Group By artikelnr,ID"
Sauf que, comme je le pressent, si ID est un identifiant unique, ta somme ne vas plus se faire.
Ou plus exactement, elle va se faire sur chacne des lignes de la table, au lieu d'un groupe de requette.
Le but de Group By est de regrouper les lignes de ta table de sorte à éliminer les doublons sur la combinaison des paramètres qui lui sont passés.
Si ID est effectivement un identifiant unique, il n'y aura, normalement pas de doublons dessus, donc pas de regroupement.
TrafMaxime
Messages postés288Date d'inscriptionmercredi 4 mai 2005StatutMembreDernière intervention26 janvier 20121 30 mai 2008 à 16:26
En fait je suis peut allé un peu vite.
Apparemment il m'accepte ta requete, casy.. le problème, c'est qu'il me prend ça :
Dim str As String = "Select artikelnr, sum(menge) from sigma Group By artikelnr"
et pas :
Dim str As String = "Select ID, artikelnr, sum(menge) from sigma Group By artikelnr"
et que sans l'ID, je peux pas updater ma base... :(
-a comprend pas-
il me dit (traduction maison, j'ai le vb allemand) : "vous essayer de faire une requête avec l'expression 'ID' qui ne fait pas partit de la fonction d'aggrégation" <- il entend par là la fonction 'SUM' a mon avis..
TrafMaxime
Messages postés288Date d'inscriptionmercredi 4 mai 2005StatutMembreDernière intervention26 janvier 20121 4 juin 2008 à 14:14
T'as tout bon casy..
Donc pour résumer, les mots clés sum(x) et group by ne font pas tout, mais mache une partie du travail..
Procédure utilisée qui marche pour ceux qui repasserait par là :
-écriture des données dans la base
-requete utilisant 'sum et group by' dans un dataset
-vider la base
-ecriture de chaque ligne du dataset 'groupé' avec affectation de l'id
ctrl + v (attention y'a des mots allemands qui peuvent piquer les yeux mais l'idée est là) :
Dim str As String = "Select artikelnr, parttype, footprint, bez, bez2, bez3, abmess, matspez, sum(menge) from sigma Group By artikelnr, parttype, footprint, bez, bez2, bez3, abmess, matspez"
Dim dastr As New OleDbDataAdapter(str, OleDbConnection4)
Dim dst As New DataSet()
Dim ff, gg As Integer
gg = dastr.Fill(dst)
Dim dsk As String = "select sigma.* from sigma"
Dim dak As New OleDbDataAdapter(dsk, OleDbConnection4)
Dim dk As New DataSet()
dak.Fill(dk)
dk.Clear()
Dim ock As OleDbCommandBuilder = New OleDbCommandBuilder(dak)
dak.UpdateCommand = ock.GetUpdateCommand
dak.Update(dk)
For ff = 0 To gg - 1
Dim dr As DataRow = dk.Tables(0).NewRow
dr("id") = ff + 1
dr("artikelnr") = dst.Tables(0).Rows(ff)("artikelnr")
dr("parttype") = dst.Tables(0).Rows(ff)("parttype")
dr("footprint") = dst.Tables(0).Rows(ff)("footprint")
dr("bez") = dst.Tables(0).Rows(ff)("bez")
dr("bez2") = dst.Tables(0).Rows(ff)("bez2")
dr("bez3") = dst.Tables(0).Rows(ff)("bez3")
dr("menge") = dst.Tables(0).Rows(ff)("expr1008")
dr("abmess") = dst.Tables(0).Rows(ff)("abmess")
dr("matspez") = dst.Tables(0).Rows(ff)("matspez")
dk.Tables(0).Rows.Add(dr)
Next
Dim ocxi As OleDbCommandBuilder = New OleDbCommandBuilder(dak)
dak.InsertCommand = ocxi.GetInsertCommand
dak.Update(dk)