sql >> Database >  >> RDS >> Sqlserver

Ik wil group_concat doen in SQL Server

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.




  1. Hoe exacte decimale waarden te hebben zonder afronding in MySQL

  2. 5 miljoen rijen in Panda's laden vanuit MySQL

  3. Hoe twee kolomwaarden te vermenigvuldigen en het resultaat aan het einde van elke rij weer te geven?

  4. MySQL - Verwijder de standaardwaarde voor het veld Datetime