Avatar billede Slettet bruger
21. februar 2011 - 11:20 Der er 9 kommentarer

Transformer

Hej,

Jeg har en rodet tabel jeg gerne vil have ordnet.

Tabellen består af følgende:

ID (ikke unikt, da samme id kan have flere fejl)
Fejlkode (46 muligheder)
Bemærkning
+ en masse andre stamdata som navn, adresse mv.

På denne måde opstår der op til 46 linier hvis et id har 46 forskellige fejl

Jeg vil gerne have "transformeret" dataen over i en ny tabel som ser ud som følger:

ID (unikt)
Fejlkode 1
Fejlkode 2
.....
Fejlkode 46
Bemærkning

Nogen som har et bud på hvordan dette kan løses?
Avatar billede Comasys Praktikant
21. februar 2011 - 12:44 #1
Det ville nok være endnu smartere hvis du deler den i to tabeller..

tabel 1
ID (unik)
+ diverse stamdata

tabel 2
trafoid (ikke unikt)
fejlkode
bemærkning

Og så bruger du en til mange, så den enkelte transformater kun er oprettet i tabel 1, og så for hver fejl der er på den opretter du en post i tabel2, med fejlkode og bemærkning og så transformatorens unikke id.
På den måde kan det også sagtens udvides til mere end 46 fejlkoder hvis der en dag skulle være brug for det.
Avatar billede johan.o Nybegynder
21. februar 2011 - 13:18 #2
Velkommen til Rolf.

Er i tvivl om du leder efter idéer til database strukturen eller kode der kan 'ordne' din transformation?

Hvis du leder efter kode tror jeg du skal bruge et eller andet script sprog - hvad bruger du?

Mvh. Johan
21. februar 2011 - 13:49 #3
rolfknudsen, min forstaaelse af spoergsmaalet er at du soeger en kode der kan transformere dine data fra den nuvaerende tabel den fremtidige tabelstruktur.  Der er jeg enig med johan.o at du ikke skal proeve at goere det i mysql (eller mere precist, jeg kender ingen maade at goere det i mysql).  Jeg vil foreslaa php, og nedenstaaende skal jeg foreslaa en kode der kan tage vare paa omsaetningen.

Yderligere er jeg enig med Comasys om at en tabel med colonner for hver af de 46 fejlkoder naeppe er hensigtsmaessigt.  En hovedtabel med ID (unikt), stamoplysninger, og bemaerkning og saa en fejltabel hvor der for hver id for hver fejlkode kommer en raekke.  Af database-tekniske aarsager boer hver raekke i fejltabellen have en unik key.)

For eksempel:
Hovedtabel
ID, navn, adresse, bemaerkning
1    hans  bygade1  bemaerkning1
2    jens  nygade2  bemaerkning2

Fejltabel
key ID fejl
1  1  25
2  1  36
3  2  21
4  1  16
5  2  12

  Du kan saa finde alle fejl paa et ID 2 med saadan en forespoergsel:  SELECT ID, fejl FROM hovedtabel h JOIN fejltabel f ON h.ID = f.ID WHERE h.ID = 2

I denne kode henter jeg foerst alle raekkerne i den gamle tabel sorteret paa ID.  Hver gang en raekke i resultatet er for en ny ID indsaettes der en raekke i hovedtabellen, og derudover indsaettes der en raekke i fejltabellen for hver raekkke i resultatet, det vil sige for hver raekke i hovedtabellen.

<?php
[forbindelse med databasen]
...
$nyID = 0;
$key = 0;
$result = mysql_query("SELECT * FROM rolf_gammel order by ID, Fejlkode");
while($row = mysql_result($result))
{
  $id = $row['ID'];
  $navn = $row['navn'];
  $adresse = $row['adresse'];
  $bemaerkning = $row['bemaerkning'];
  $fejlnummer = $row['fejlnummer'];
  if($id != $nyID)
  {
    $id = $row['ID'];
    $navn = $row['navn'];
    $adresse = $row['adresse'];
    $bemaerkning = $row['bemaerkning'];
    $nyID = $id;
    mysql_query("INSERT INTO rolf_hovedtabel(ID, navn, adresse, bemaerkning) VALUES ($ID, $navn, $adresse, #bemaerkning)");
  }
  $fejlID++;
  mysql_query("INSERT INTO rolf_fejltabel(key, ID, fejl) VALUES($fejlID, $id, $fejlnummer))");
}
...
/>
21. februar 2011 - 13:53 #4
Jeg ville have tilfoejet foelgende:

1.  Det ser ud til at bemaerkninger er per ID, ikke per fejl.  Hvis der kan vaere bemaerkninger for hver fejl skal feltet bemaerkninger naturligvis flyttes til fejltabellen og koden i loekken tilpasses.

2.  Og for nemheds skyld tog jeg kun to stamoplysninger med, men hovedtabellen skal naturligvis udvides med alle de andre stamoplysninger
Avatar billede Slettet bruger
21. februar 2011 - 14:59 #5
Hej alle sammen,

Tak for jeres svar.

Jeg har i midlertidig ikke fundet det ønskede svar.

Jeg ønsker ikke at opdele det i to tabeller og jeg ønsker hjælp til noget "kode" som kan rydde op i den tabel jeg har.

Jeg bruger normalt phpmyadmin til at lave dataudtræk.

Det betyder ikke så meget, at det ikke er den mest optimale måde at gøre tingene på da jeg kun har behov for, at lave denne transformering 1 gang om året.

Data'en skal efterfølgende eksporteres til Excel så der kan laves noget statistik herpå.

Jeg beklager hvis jeg ikke har tydelig gjort mit spørgsmål.
Avatar billede johan.o Nybegynder
21. februar 2011 - 16:56 #6
Er ikke super skarp i mySQL men det kan vist kodes så du kan 'køre' det fra phpMyAdmin.

Det hjælper nok hvis du viser et eksempel på en linje fra den eksisterende tabel.

Det er især hvad der er i tabellen under fejlkode - står der et nummer? eller noget tekst?

Hvad vil du gerne have at der står i den nye tabel under f.eks. fejlkode1? - Et x? - Et tal?

Mvh. Johan
21. februar 2011 - 22:08 #7
Ja, dit behov var ikke saa nemt at regne ud.  Du sagde at tabellen var rodet.  Derfor gik jeg (og andre aabenbart ogsaa) ud fra at du oenskede restrukturere til et mindre 'rodet' database design.  Det synes saa ikke at vaere tilfaeldet.  Du vil fortsaette med den bestaaende tabel, men af og til (en gang om aaret) har du brug for at exportere dataerne til Excell og soeger som mellemtrin en maade at opstille dataerne i en enkelt raekke for hver id nummer, og du oensker at denne restrukturering foregaar uden brug af andre 'redskaber' end mysql og phpMyAdmin.

Jeg ventede for at se om andre skulle foreslaa loesninger til det, men det skete ikke.  Jeg synes heller ikke at det ligger saa lige for, og du er ikke selv saa meddelsom med din nuvaerende datastruktur (du blev spurgt om flere oplysninger i $6.) 

Du forklarer at den nuvaerende tabel har kolonnerne ID, Fejlkode, Bemaerkning, navn, adresse, og en del flere kolonner til stamdata.  Men der kan vaere op til 46 raekker med det samme ID men med forskellige fejlkoder.  Er det korrekt at der for hver ID kun er et saet stamoplysninger?  Er der ogsaa kun en bemaerkning for hvert ID, eller er der (eller kan der vaere) en bemaerkning for hver fejlkode?  Hvilke vaerdier viser du i kolonnen Fejlkode?  Et tal mellem 1 og 46?  Gentager du stamoplysningerne for et ID i hver raekke, eller staar de kun i foerste raekke med den foerste fejlkode saaledes at disse kolonner kolonner er tomme i raekker med efterfoelgende fejlkoder?  Jeg laver her et mini-eksempel med kun en stamdata, navn, foruden id, fejlkode, og bemaerkning.  Er dette representativt for din tabel?

ID Fejlkode Bemaerkning Navn
1      17      abc      Hans
1      23      abc      Hans
2      15      def      Jens
1      36      abc      Hans
2      23      def      Jens

Eller ser det snarere saaledes ud:
1    17      abc      Hans
1    23
2    15      def      Jens
1    16
2    23
23. februar 2011 - 21:14 #8
rolfknudsen, du reagerede ikke paa indlaeggene #6 og #7. Er spoergsmaalet i mellemtiden ikke laengere aktuelt (hvad enten du selv fandt en loesning, har har omformuleret problemet, eller ..?)  I saa fald venligst luk spoergsmaalet igen.  Jeg kan se at du er ny paa Eksperten, saa lad mig forklare (maaske til overflod):  Man lukker et spoergsmaal ved at accepter et svar.  Et svar er et indlaeg markeret med gult og med en lille firkant ved teksten "Accepter dette svar".  Til dette spoergsmaal har du kun faaet kommentarer (ikke markeret med gult.)  Hvis man faar et hjaelpsomt svar i form af kommentar beder man den der har lavet indlaegget om at oprette et svar, og naar svaret kommer accepterer man det ved at saette et 'flueben' i den lille firkant og derefter klikke paa feltet "Accepter svar og afgiv points."  Hvis man ikke faar hjaelpsomme indlaeg opretter man selv et svar (hvor man blot kan sige "Jeg lukker" eller, bedre, forklare hvordan man har loest det) og accepterer det.

Hvis du derimod oensker at fortsaette med spoergsmaalet saa reager paa indlaeggene saa vi kan komme videre.
17. juli 2011 - 09:39 #9
roldknudsen, jeg prøver lige en gang til.  Du oprettede spørgsmålet, men de modtagne indlæg svarede ikke til dit behov, og du gav ikke yderligere forklaring på behovet, hvad enten fordi problemet i mellemtiden ikke længere var aktuelt eller du selv fandt en løsning (i så fald til lykke.)  Men du fik ikke lukket spørgsmålet.  Det står derfor stadig som åbent ikke alene i din liste af indlæg, men også hos mig og hos de øvrige medlemmer der kom med indlæg.  Så ironisk nok er vores forsøg på at hjælpe resulteret i et problem hos os.  Det vil være fint, hvis du nu kunne afslutte hvad du begyndte og lukke spørgsmålet.  Det gør du, i dette tilfælde (fordi der ikke kom brugbare svar) ved at oprette et svar, indlæg med prik ved Svar i stedet for ved Kommentar, sætte et 'flueben' i firkanten ved 'Accepter dette svar', og klikke på feltet 'Accepter svar og afgiv points'.  Gider du?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester