Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Chcę zrobić group_concat w SQL Server

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uprawnienia usług Reporting Services w usługach SQL Server R2 SSRS

  2. Zapytanie SQL Server, które identyfikuje brakujące dane dla określonych dat

  3. Kiedy lepiej przechowywać flagi jako maskę bitową zamiast używać tabeli asocjacyjnej?

  4. MS SQL Server 2008 :Pobieranie daty rozpoczęcia i zakończenia tygodnia do następnych 8 tygodni

  5. Wyłącz wszystkie indeksy nieklastrowane