Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Искам да направя group_concat в SQL Server

За да ви дам илюстрация на присъединяване (в този случай самостоятелно присъединяване, но всички присъединявания работят) и използване на STUFF за това. Обърнете внимание на клаузата WHERE вътре в STUFF. Това е, което свързва записа с правилните стойности.

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  

Редактиране

Добре, така че това, което искате (това, което наистина, наистина искате) е:

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

Забележете промяната тук. SELECT в STUFF вече е от подзаявка, така че можете да групирате по EmailAddress.

Допълнително обяснение

Вашата цел е да имате конкатенация от продуктови кодове, групирани по клиент (представен чрез имейл адрес). Проблемът е, че продуктовите кодове са в таблицата с подробности за поръчката, а имейл адресът е в таблицата с клиенти, но няма поле, което да свързва двете. Таблицата с клиенти има връзка едно към много с таблицата с поръчки, а таблицата с поръчки има връзка едно към много с таблицата с подробности за поръчката. Това е едно ниво на абстракция твърде много. Така че трябва да помогнем на базата данни, като предоставим директна връзка между кода на продукта и имейл адреса. Това правим чрез подзаявката. Надявам се, че това ви е по-ясно.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да архивирате Sql база данни програмно в C#

  2. Защо ISNUMERIC('.') връща 1?

  3. Първи стъпки със SQL Server 2017 на Linux в портала Azure

  4. SQL Server 2008 - Свиване на регистъра на транзакциите - Има ли начин за автоматизиране?

  5. как да се покаже стойността на колоната само веднъж, ако се повтаря и е празна, докато в sql не дойде различна стойност