Aby dać ci ilustrację łączenia (w tym przypadku self join, ale wszystkie łączenia działają) i używania do tego STUFF. Zwróć uwagę na klauzulę WHERE wewnątrz STUFF. To właśnie łączy rekord z poprawnymi wartościami.
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
Edytuj
OK, więc to, czego chcesz (to, czego naprawdę, naprawdę chcesz) to:
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()
Zwróć uwagę na zmianę tutaj. SELECT w STUFF pochodzi teraz z podzapytania, dzięki czemu możesz grupować według adresu e-mail.
Dodatkowe wyjaśnienie
Twoim celem jest stworzenie konkatenacji kodów produktów pogrupowanych według klientów (reprezentowanych przez adres e-mail). Problem polega na tym, że kody produktów znajdują się w tabeli szczegółów zamówienia, a adres e-mail w tabeli klientów, ale nie ma pola, które łączy te dwa elementy. Tabela klientów ma relację jeden do wielu z tabelą zamówień, a tabela zamówień ma relację jeden do wielu z tabelą szczegółów zamówienia. To o jeden poziom abstrakcji za dużo. Dlatego musimy pomóc bazie danych, zapewniając bezpośrednie połączenie między kodem produktu a adresem e-mail. Robimy to poprzez podzapytanie. Mam nadzieję, że to dla Ciebie wyjaśni.