[SQL] In elkaar vouwen van ruwe data

Pagina: 1
Acties:

  • UnderFlow
  • Registratie: November 2000
  • Laatst online: 15-01-2024
Ik zit met het volgende probleem waar ik even helemaal geen oplossing voor zie. Even de structuur aangeven zoals ik die nu heb. Na het ruw inlezen krijg ik deze structuur:

codesub-codemeetwaarde
12
34
10
20
30
56
50
40
78
91
10
20


Nu is het mijn bedoeling dat ik dat geheel in elkaar vouw per hoofdcode en sub-code. De meetwaarde moet dan opgeteld worden. Vooral die lege velden zijn het probleem. Als er op een bepaalde manier de gegevens uitgevuld kunnen worden zodat de code en sub-codes op elke regel herhaald worden is het ook goed.

Het uiteindelijke plaatje zou dan 3 regels moeten zijn zoals hieronder zeg maar.

12;34;60
12;56;90
78;91;30

Een simpele group by met een sum is niet mogelijk doordat naast de meetwaarde twee lege velden staan dus hij telt alles op. Als iemand hier een idee over heeft of me in een richting kan sturen zou ik dat zeer op prijs stellen. Ik heb het idee dat het niet moeilijk is, maar het zal wel aan het eind van de werkdag liggen dat ik het niet zie :?

Verwijderd

Een database is geen excel sheet, dus de ruwe structuur slaat nergens op. Ik weet niet precies de betekenis van de gegevens, dus je zal meer informatie moeten geven over wat de waardes nu werkelijk voorstellen om je te kunnen adviseren hierover.

Edit:
Ik neem aan dat het volgende meer in de richting komt:
codesub-codemeetwaarde
123410
123420
123430
125650
125640
789110
789120

Dan zwijg ik nog even over het feit dat je 2 herhalende groepen in deze tabel hebt ...

[ Voor 57% gewijzigd door Verwijderd op 15-09-2005 17:47 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

UnderFlow schreef op donderdag 15 september 2005 @ 17:33:
Een simpele group by met een sum is niet mogelijk doordat naast de meetwaarde twee lege velden staan dus hij telt alles op.
Dit klinkt heel vaag...leg eens uit met je databasemodel erbij?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • UnderFlow
  • Registratie: November 2000
  • Laatst online: 15-01-2024
Ok het zijn geen echte gegevens het is puur een voorbeeld van hoe de gegevens nu in mijn tabel staan.

Ik krijg mijn data zo binnen (dit is wel echte data)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
UNB UNOA:2  8717185180008:14    8716868000107:14    050914:0947 2004119742
UNH 120203  MSCONS:D:97A:UN:EGG102  NULL    NULL    NULL
BGM P04::ZEW    DAYREP08746 9   NULL    NULL
DTM Z05:0:805   NULL    NULL    NULL    NULL
DTM 137:200509052336:203    NULL    NULL    NULL    NULL
DTM Z01:200508010400200509010400:719    NULL    NULL    NULL    NULL
NAD ZNO 8717185180008::9    NULL    NULL    NULL
NAD SU  8716868000107::9    NULL    NULL    NULL
UNS D   NULL    NULL    NULL    NULL
NAD UD  NULL    NULL    NULL    NULL
LOC 231 871718518003010615::9   NULL    NULL    NULL
RFF Z15:N   NULL    NULL    NULL    NULL
RFF Z16:C   NULL    NULL    NULL    NULL
LIN 1   NULL    NULL    NULL    NULL
QTY Z99:0   NULL    NULL    NULL    NULL
CCI 10  :11G    NULL    NULL    NULL
MEA AAE ZEF JM1:4475    NULL    NULL
DTM 7:200508010500:203  NULL    NULL    NULL    NULL
CCI 10  :11G    NULL    NULL    NULL
MEA AAE ZEF JM1:38907   NULL    NULL
DTM 7:200508010600:203  NULL    NULL    NULL    NULL

Alles staat in afzonderlijke kolommen, omdat ik alleen maar aan het testen ben zijn dit col001, col002 etc.

Nu staat er alleen maar op bepaalde regels en in bepaalde kolommen relevante gegevens. Deze haal ik er met de volgende query uit:

code:
1
2
3
4
5
6
7
8
9
10
11
12
select 
    DAYREP = case
        when col001 = 'BGM' then col003
        end
    , EAN = case
        when col001 = 'LOC' then left(col003, 18)
        end
    , MEETWAARDE = case
        when col001 = 'MEA' then substring(col004, 5, len(col004))
        end
from <tabel>
where col001 in ('BGM', 'MEA', 'DTM', 'LOC')


als resultaat krijg ik dan de gegevens zoals ik aan gaf:

code:
1
2
3
4
5
6
7
8
DAYREP08746 NULL    NULL
NULL    NULL    NULL
NULL    NULL    NULL
NULL    NULL    NULL
NULL    871718518003010615  NULL
NULL    NULL    4475
NULL    NULL    NULL
NULL    NULL    38907


De nulls zou ik eigenlijk moeten vervangen door lege velden, maargoed.

Maar wat ik uiteindelijk wil is 1 regel in dit geval met daarop

code:
1
DAYREP08746 871718518003010615  43382


Het is een beetje lastig uit te leggen zo, maar ik hoop dat het wat duidelijker is. Wellicht heb ik in mijn eerste stap al een denkfout gemaakt en kan het veel makkelijker.

Verwijderd

Ik denk dat je een parser zal moeten schrijven die de input op een gestructureerde manier opslaat in de database. Simpelweg deze data 1-op-1 in de database zetten is geen goede oplossing. Wellicht is dit een exotisch standaardformaat en bestaat er al een parser voor.

Als je nog specifieke vragen hebt over het bouwen van zo'n parser, dan zou ik ook een titel change aanvragen (mbv een topic report) en ons voorzien van relevante informatie, zoals de programmeeromgeving / -taal waarin dit gebouwd zal worden, de betekenis van de data, of er al een database ontworpen is om dit goed op te slaan, de gewenste resultaten, etc.

offtopic:
Triest dat veel dataexchange nog steeds niet met XML gebeurt ... dan was je zo klaar geweest.