Om je een illustratie te geven van joinen (in dit geval een self-join, maar alle joins werken) en STUFF hiervoor gebruiken. Let op de WHERE-component in de STUFF. Dit is wat het record aan de juiste waarden koppelt.
declare @test table
(
email varchar(50),
address varchar(50)
)
insert into @test VALUES
('[email protected]','A123A'),
('[email protected]','AB263'),
('[email protected]','45632A'),
('[email protected]','78YU'),
('[email protected]','6543D')
SELECT DISTINCT
email,
Stuff((SELECT ', ' + address
FROM @test t2
WHERE t2.email = t1.email
FOR XML PATH('')), 1, 2, '') Address
FROM @test t1
Bewerken
Oké, dus wat je wilt (wat je echt, echt wilt) is:
declare @customers table
(
emailaddress varchar(50),
customerid int
)
insert into @customers VALUES
('[email protected]',1),
('[email protected]',2)
declare @orders table
(
orderid int,
customerid int,
orderdate date
)
insert into @orders VALUES
(1, 1, '2017-06-02'),
(2, 1, '2017-06-05'),
(3, 1, '2017-07-13'),
(4, 2, '2017-06-13')
declare @orderdetails table
(
id int,
orderid int,
productcode varchar(10)
)
insert into @orderdetails VALUES
(1, 1, 'apple pie'),
(2, 1, 'bread'),
(3, 2, 'custard'),
(4, 2, 'orange'),
(5, 3, 'orange'),
(6, 4, 'orange')
SELECT DISTINCT c.EmailAddress, productcode=
STUFF((SELECT ',' + odc.productcode FROM
(SELECT DISTINCT emailaddress,productcode FROM
@orders o2 inner join @orderdetails od2 on
o2.orderid = od2.orderid
inner join @customers c2 ON c2.customerid = o2.customerid) odc
WHERE odc.emailaddress=c.emailaddress
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM @OrderDetails od
JOIN @Orders o ON od.OrderID = o.OrderID
JOIN @Customers c ON c.CustomerID=o.CustomerID
WHERE o.OrderDate BETWEEN '2016-01-01' AND getdate()
Let hier op de verandering. De SELECT in de STUFF is nu van een subquery, zodat je kunt groeperen op EmailAddress.
Aanvullende uitleg
Uw doel is om een aaneenschakeling van productcodes te hebben, gegroepeerd per klant (vertegenwoordigd door e-mailadres). Het probleem is dat productcodes in de tabel met orderdetails staan en e-mailadres in de tabel met klanten, maar er is geen veld dat de twee verbindt. De klantentabel heeft een één-op-veel-relatie met de besteltabel en de besteltabel heeft een één-op-veel-relatie met de bestelgegevenstabel. Dat is een abstractieniveau te veel. We moeten de database dus een handje helpen door een directe koppeling te maken tussen productcode en e-mailadres. Dit doen we via de Sub-query. Ik hoop dat dit het duidelijker voor je maakt.