• Privacywetgeving
    Het is bij Helpmij.nl niet toegestaan om persoonsgegevens in een voorbeeld te plaatsen. Alle voorbeelden die persoonsgegevens bevatten zullen zonder opgaaf van reden verwijderd worden. In de vraag zal specifiek vermeld moeten worden dat het om fictieve namen gaat.

Regels queryresultaat opsplitsen

Status
Niet open voor verdere reacties.

ArjanVos

Gebruiker
Lid geworden
23 okt 2015
Berichten
82
In een brontabel in mijn database (Progress) heb ik per product de te leveren aantallen en het aantal maanden waarover de leveringen verdeeld moeten worden. Nu wil ik de aantallen graag in een tabel krijgen met de aantallen per combinatie product/maand in rijen onder elkaar. Hoe krijg ik dat voor elkaar? Liefst in het SQL statement, of anders via verdere bewerking in Power Query.

Brontabel:

ProductAantalMaanden resterend
A303
B502

Gewenst resultaat (de laatste rij met nul stuks mag evt. vervallen):

ProductMaandAantal
A110
A210
A310
B125
B225
B30
 
Laatst bewerkt:
Met Vba.

Code:
Sub hsv()
Dim sv, i As Long, ii As Long, n As Long
With Cells(1).CurrentRegion
sv = .Value
.Columns(3).Name = "b"
ReDim a([sum(b)], 2)
 For i = 1 To UBound(sv)
  For ii = 1 To sv(i, 3)
     a(n, 0) = sv(i, 1)
     a(n, 1) = ii
     a(n, 2) = sv(i, 2) / sv(i, 3)
   n = n + 1
  Next ii
Next i
.Offset(, 5).Resize(n, 3) = a
End With
End Sub
 
Laatst bewerkt:
Beste Harry, bedankt voor je snelle reactie. Met VBA kom ik inderdaad wel tot een oplossing, ook als de getallen niet deelbaar zijn. Maar ik wil het in dit geval graag zonder VBA oplossen. Dus als iemand een oplossing weet in het SQL statement of in Power Query, dan is die nog steeds erg welkom.
 
Toch nog zelf een oplossing gevonden in SQL. Het resterend aantal maanden is nooit groter dan 12, dus de tabel mnd in de query had iedere tabel met de nummers 1 t/m 12 kunnen zijn. Ik had gewoon in mijn database even een tabel nodig waar ik die getallen vandaan kon halen en dat was de tabel met orderregels, die een veld regelnummers bevat.

Code:
Select
  contract.product As 'Product',
  mnd.regelnummer As 'Maand',
  contract.aantal / contr.maanden As 'Aantal',
From
  contract Inner join
(Select distinct
  orders.regelnummer
From
  orders
Where
  orders.regelnummer <= 12) mnd On mnd.regelnummer <= contract.maanden
 
Ik heb geen loodverstand van SQL; waar plaats je zoiets en hoe wordt dat aangeroepen?
Kan je eens je bestand plaatsen met je tabel?
 
Dag Harry,
Een bestand plaatsen gaat helaas niet, omdat daar de connectiestring naar onze database in staat en die heb ik liever niet online. Maar in dit geval hebben we een ODBC-gegevensbron aangemaakt onder Windows, waarin je o.a. aangeeft op welke server de database staat, wat de naam van de database is, via welke poort je connectie maakt.
Vanuit Excel roep je die gegevensbron aan via Gegevens > Gegevens ophalen > Uit andere bronnen > Uit ODBC. Kies vervolgens de naam van je gegevensbron.
Klik je nu op OK, dan kun je tabellen uit je database selecteren die je op wilt halen en daarmee binnen Excel verder gaan werken. Maar klik je eerst op "Geavanceerde opties", dan kun je in het veld SQL-instructie iets typen/plakken als bovenstaand om alleen maar een selectie van bepaalde velden uit een tabel op te halen, gegevens uit verschillende tabellen met elkaar te combineren, filters toe te passen, berekende velden te maken, etc.

Maar net zoals VBA een taal is die je moet leren, geldt dat ook voor SQL, dus dat is niet even snel uitgelegd. Maar met een database om op te oefenen en wat hulp van Google is het voor iemand als jij vrij snel te leren. Zeker in combinatie met Power Query binnen Excel (of Power BI) heb je enorm krachtige tools in handen.
 
Hallo Arjan,

Ik begrijp dat dat niet kan.
Ik zal als de tijd er voor is me eens verdiepen in die materie.

Bedankt voor je reactie.
 
Gewoon voor de aardigheid even vermelden: je kan ook perfect sql-code implementeren in de vba-code, dan wordt het helemaal plezant.
Wat ik vaak doe ten behoeve van mijn users: op basis van keuzelijsten (op werkblad of userform) de sql-instructie helemaal in elkaar laten steken (in een tekstvariabele dus) in een eerste fase van een vba-procedure om ze meteen daarna te laten uitvoeren. Dat reduceert de taak van de gebruiker tot enkel klikken, maar wel met flexibiliteit zo groot als je dat als ontwerper maar wil.
Enig risico: je wil daarna nooit nog zonder :d
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan