sql >> Database teknologi >  >> RDS >> Sqlserver

Jeg vil lave group_concat i SQL Server

For at give dig en illustration af at deltage (i dette tilfælde en selvtilslutning, men alle sammenføjninger virker) og bruge STUFF til dette. Læg mærke til WHERE-sætningen inde i TINGET. Det er det, der forbinder posten med de korrekte værdier.

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  

Rediger

OK, så hvad du ønsker (det du virkelig, virkelig ønsker), er:

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()

Bemærk ændringen her. SELECT i TINGET er nu fra en underforespørgsel, så du kan gruppere efter e-mailadresse.

Yderligere forklaring

Dit mål er at have en sammenkædning af produktkoder grupperet efter kunde (repræsenteret ved e-mailadresse). Problemet er, at produktkoder er i ordredetaljer-tabellen, og e-mailadresse er i kundetabellen, men der er intet felt, der forbinder de to. Kundetabellen har en en til mange relation til ordretabellen, og ordretabellen har en en til mange relation til tabellen med ordredetaljer. Det er ét abstraktionsniveau for meget. Så vi er nødt til at give databasen en hjælpende hånd ved at give et direkte link mellem produktkode og e-mailadresse. Dette gør vi via underforespørgslen. Jeg håber, at dette gør det mere klart for dig.




  1. Forhindr mysql casting streng til int in where klausul

  2. Stort heltalsfelt i django-modeller

  3. Gentageligt job til Laravel json api

  4. Effektiv sammenføjning over intervalområder i SQL