sql >> Databasteknik >  >> RDS >> Sqlserver

Jag vill göra group_concat i SQL Server

För att ge dig en illustration av att gå med (i det här fallet en självanslutning, men alla anslutningar fungerar) och använda STUFF för detta. Lägg märke till WHERE-satsen inuti STUFF. Det är detta som länkar posten till rätt värden.

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  

Redigera

OK så vad du vill (vad du verkligen, verkligen vill) är:

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

Lägg märke till förändringen här. SELECT i STUFF är nu från en underfråga, så att du kan gruppera efter e-postadress.

Ytterligare förklaring

Ditt mål är att ha en sammankoppling av produktkoder grupperade efter kund (representerade av e-postadress). Problemet är att produktkoderna finns i orderinformationstabellen och e-postadressen finns i kundtabellen, men det finns inget fält som länkar de två. Kundtabellen har en en till många relation med ordertabellen och ordertabellen har en en till många relation med orderdetaljer tabellen. Det är en abstraktionsnivå för mycket. Så vi måste ge databasen en hjälpande hand genom att tillhandahålla en direktlänk mellan produktkod och e-postadress. Detta gör vi via underfrågan. Jag hoppas att detta gör det tydligare för dig.




  1. Vilolägeskommentar för PostgreSQL seriell typ

  2. Hur man kontrollerar om en tabell finns i ett givet schema

  3. Konfigurera MySQL-backend i Azure för Xamarin Offline Sync

  4. Välj varje rad och infoga i en annan tabell