Ik heb een heel ingewikkelde query met een hoop statements.
Er zijn vier tabellen.
• Order
• ProductOrder
• ProductVersion
• QuantityDiscount
Order bevat orders. ProductVersion bevat de producten. ProductOrder is een koppeling tussen deze twee en heeft onder andere een hoeveelheid (hoeveel keer een bepaald product is besteld in een order).
Tot dan gaat alles goed. Maar nu hebben we iets leuks: een tabel QuantityDiscount die een korting op een bepaald product geeft zodra deze een x-aantal keer besteld is. Dus bijvoorbeeld als ik 10 keer een iPod bestel dan krijg ik 5% korting per iPod. Uiteraard niet over de gehele order.
De QuantityDiscount tabel ziet er als volgt uit:
Ook het berekenen van de discount gaat op zich prima met de volgende query:
Zoals je ziet is mijn bedoeling om alle orders terug te krijgen met daarbij het totaalbedrag van die order. Op zich gaat het goed met bovenstaande query, op één uitzondering na, namelijk als er meerdere QuantityDiscount rijen zijn voor één ProductVersionId: als ik 20 producten bestel en er zijn discounts voor vanaf 10 en 20 producten, dan moet hij die van 20 nemen. Momenteel neemt hij echter beide rijen en telt de discount op (!) (bijvoorbeeld 0,3 + 0,5 betekent dat je 80% moet betalen, terwijl je dus bijvoorbeeld maar 30% hoeft te betalen).
Hoe is dit op te lossen
.
Een order by-clausule voor de "left outer join qd.Border" is niet mogelijk, omdat het veld dan moet worden opgenomen in de SELECT. Vervolgens moet, omdat er een SUM wordt gebruikt, deze ook bij de GROUP BY worden opgenomen en dan krijg je 2 rijen terug zodra er twee QuantityDiscount rijen zijn voor één ProductVersionId.
Om dezelfde reden is ook een GROUP BY niet mogelijk.
MAX werkt ook niet omdat niet altijd de hoogste waarde moet worden geretourneerd.
Het is een klein beetje ingewikkeld en alle SQL guru's hier hebben ook geen idee hoe je dit nou moet oplossen, dus hopelijk heeft iemand hier een geniale ingeving
.
Alvast bedankt.
Er zijn vier tabellen.
• Order
• ProductOrder
• ProductVersion
• QuantityDiscount
Order bevat orders. ProductVersion bevat de producten. ProductOrder is een koppeling tussen deze twee en heeft onder andere een hoeveelheid (hoeveel keer een bepaald product is besteld in een order).
Tot dan gaat alles goed. Maar nu hebben we iets leuks: een tabel QuantityDiscount die een korting op een bepaald product geeft zodra deze een x-aantal keer besteld is. Dus bijvoorbeeld als ik 10 keer een iPod bestel dan krijg ik 5% korting per iPod. Uiteraard niet over de gehele order.
De QuantityDiscount tabel ziet er als volgt uit:
code:
1
2
3
| ProductVersionId int 4 Border int 4 Factor decimal 9 |
Ook het berekenen van de discount gaat op zich prima met de volgende query:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| SELECT
DISTINCT(o.Id),
o.TrackingKey,
SUM(COALESCE(qd.Factor * (po.Quantity * pv.Price), po.Quantity * pv.Price)) AS SubTotal
FROM
[Order] AS o
INNER JOIN ProductOrder AS po
ON po.OrderId = o.Id
INNER JOIN ProductVersion AS pv
ON pv.Id = po.ProductVersiontId
LEFT OUTER JOIN QuantityDiscount AS qd
ON qd.ProductVersionId = pv.Id AND po.Quantity >= qd.Border
GROUP BY
o.Id, o.TrackingKey |
Zoals je ziet is mijn bedoeling om alle orders terug te krijgen met daarbij het totaalbedrag van die order. Op zich gaat het goed met bovenstaande query, op één uitzondering na, namelijk als er meerdere QuantityDiscount rijen zijn voor één ProductVersionId: als ik 20 producten bestel en er zijn discounts voor vanaf 10 en 20 producten, dan moet hij die van 20 nemen. Momenteel neemt hij echter beide rijen en telt de discount op (!) (bijvoorbeeld 0,3 + 0,5 betekent dat je 80% moet betalen, terwijl je dus bijvoorbeeld maar 30% hoeft te betalen).
Hoe is dit op te lossen
Een order by-clausule voor de "left outer join qd.Border" is niet mogelijk, omdat het veld dan moet worden opgenomen in de SELECT. Vervolgens moet, omdat er een SUM wordt gebruikt, deze ook bij de GROUP BY worden opgenomen en dan krijg je 2 rijen terug zodra er twee QuantityDiscount rijen zijn voor één ProductVersionId.
Om dezelfde reden is ook een GROUP BY niet mogelijk.
MAX werkt ook niet omdat niet altijd de hoogste waarde moet worden geretourneerd.
Het is een klein beetje ingewikkeld en alle SQL guru's hier hebben ook geen idee hoe je dit nou moet oplossen, dus hopelijk heeft iemand hier een geniale ingeving
Alvast bedankt.