Matrix opbouwen uit meerdere regels en kolomen
Alleen ik loop tegen een beperking van mijn kennis aan en kan via google niet een oplossing voor mijn probleem vinden.
Ik ben begonnen met de volgende sql query:
Quote:
SELECT
SC450700.[SC45002] AS [StocCommGrp],
SC450700.[SC45003] AS [Klant],
SC450700.[SC45004] AS [Dicount0],
SC450700.[SC45005] AS [Dicount1],
SC450700.[SC45006] AS [Dicount2],
SC450700.[SC45007] AS [Dicount3],
SC450700.[SC45008] AS [Dicount4],
SC450700.[SC45009] AS [Dicount5],
SC450700.[SC45010] AS [Dicount6],
SC450700.[SC45011] AS [Dicount7],
SC450700.[SC45012] AS [Dicount8],
SC450700.[SC45013] AS [Dicount9]
FROM SC450700
SC450700.[SC45002] AS [StocCommGrp],
SC450700.[SC45003] AS [Klant],
SC450700.[SC45004] AS [Dicount0],
SC450700.[SC45005] AS [Dicount1],
SC450700.[SC45006] AS [Dicount2],
SC450700.[SC45007] AS [Dicount3],
SC450700.[SC45008] AS [Dicount4],
SC450700.[SC45009] AS [Dicount5],
SC450700.[SC45010] AS [Dicount6],
SC450700.[SC45011] AS [Dicount7],
SC450700.[SC45012] AS [Dicount8],
SC450700.[SC45013] AS [Dicount9]
FROM SC450700
Dan krijg ik als output:
10 KLANT 1 Dicount0 Dicount1 etc
10 KLANT 2 Dicount0 Dicount1 etc
20 KLANT 1 Dicount0 Dicount1 etc
20 KLANT 2 Dicount0 Dicount1 etc
etc
Nu wil ik:
.................DISCOUNT 10......DISCOUNT 11.....(....)..DISCOUNT 20........(etc)
KLANT 1....10 / Dicount0.......10 / Dicount1.......(....)...20 / Discount0....(etc)
(ik heb punten gebruikt om te zorgen dat de tabel een beetje duidelijk overkomt)
Nu heb ik dit een beetje gelukt door het volgende te doen:
Quote:
CASE WHEN SC450700.[SC45002] = 10 THEN SC450700.[SC45004] END as [DISC CODE 10],
CASE WHEN SC450700.[SC45002] = 10 THEN SC450700.[SC45005] END as [DISC CODE 11],
(....)
CASE WHEN SC450700.[SC45002] = 20 THEN SC450700.[SC45004] END as [DISC CODE 20],
CASE WHEN SC450700.[SC45002] = 20 THEN SC450700.[SC45005] END as [DISC CODE 21],
CASE WHEN SC450700.[SC45002] = 20 THEN SC450700.[SC45006] END as [DISC CODE 22],
CASE WHEN SC450700.[SC45002] = 10 THEN SC450700.[SC45005] END as [DISC CODE 11],
(....)
CASE WHEN SC450700.[SC45002] = 20 THEN SC450700.[SC45004] END as [DISC CODE 20],
CASE WHEN SC450700.[SC45002] = 20 THEN SC450700.[SC45005] END as [DISC CODE 21],
CASE WHEN SC450700.[SC45002] = 20 THEN SC450700.[SC45006] END as [DISC CODE 22],
Nu krijg ik een mooie rij 10 - 19 en dan 20 - 29 maar die krijg ik niet achter elkaar. (ben dus halverwege de oplossing)
Nu zijn het 99 codes en ca. 80 klantgroepen.
De vraag is:
- hoe krijg ik een mooie matrix uit de SQL database?
- hoe kan ik dit voor elkaar krijgen zonder tientallen regels met CASE WHEN te maken.
Gewijzigd op 05/11/2012 16:30:39 door Jonathan van den Berg
Het lijkt erop dat je datamodel niet in order is, als je een kalnt hebt met 99 velden discount is het wellicht zinvol om dit te normaliseren?
Dat normaliseren is al gedaan, niet alle van de 99 velden worden gebruikt.
Nu wil ik er een kortingsmatrix van maken, zodat iedereen in de matrix kan zien welke korting geldt. (er staan in elk tiental enkele actieve groepen)
Zelf vind ik het aantal kortingsgroepen van 99 niet zo heel veel, het gaat namelijk om een zeer grote aantal verschillende producten.
telefoon1, telefoon2, telefoon3
... dan ben je slecht bezig. Dat is niet de bedoeling. Dan moet je normaliseren.
Je zegt dat je daar al aan gewerkt hebt, maar voor mij ruikt het nog steeds naar een niet-genormaliseerde constructie.
Wat jij nodig hebt:
Een tabel 'klanten'; een tabel 'kortingen'
En dan moet je de tabel kortingen maken, zodat ze kunnen gelden voor alle groepen kortingen.
In die tabel kortingen heb je een veld klant_id; en verder alles wat je daar nodig hebt.
Zo is er een link tussen de korting en de klant, maar heb je geen 100 velden nodig.
Dat is normaliseren.
Lees nog eens deftig een tutorial over normaliseren; kwestie dat je het concept goed begrijpt.
Jonathan van den Berg op 05/11/2012 16:45:37:
... Dat normaliseren is al gedaan, niet alle van de 99 velden worden gebruikt. ...
... het gaat namelijk om een zeer grote aantal verschillende producten. ...
... het gaat namelijk om een zeer grote aantal verschillende producten. ...
Want deze argumenten doen echt absoluut niets ter zake. Daar gaat het niet om.
en o ja ... dan kan je in je database namen gebruiken die leesbaar zijn; in plaats van die gecodeerde tabel- en veldnamen.
Gewijzigd op 05/11/2012 18:06:52 door Kris Peeters
Ik begrijp nu wat er bedoeld wordt met normalisatie.
Alleen de database kan ik zelf niks aan veranderen, het is een onderliggende database van een programma.
Ik had al me bedenkingen bij de manier van opbouw, maar daar kan ik niks aan veranderen.
Wat zijn de mogelijkheden behalve wat ik bovenstaande heb aangegeven.
Als ik daarmee door ga dan krijg ik de volgende tabel:
10 - Klant 1 - kg 10 - kg 11 - kg 12 - (..) kg 19
20 - Klant 1 - NULL - NULL - NULL - NULL - (....) - kg 20 - kg 21 - etc
Ik kan dus niet iets aanpassen aan de database.
Mijn uitdaging is om de data uit de database te halen en het op een inzichtelijke manier te presenteren.
Ik wil eigenlijk gewoon een tabel maken met horizontaal de kortingsgroepen en verticaal de klantgroepen.
Eigenlijk is daar weinig geks aan behalve dat de database waaruit de gegevens komt nogal ingewikkeld is opgebouwd.
Hoe is je db structuur. Misschien brengt dit meer duidelijkheid voor ons om je te helpen met een oplossing.
Groet,
Erwin van Hoof
SiteOn