Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tôi muốn làm group_concat trong SQL Server

Để cung cấp cho bạn một minh họa về việc tham gia (trong trường hợp này là tự tham gia, nhưng tất cả các liên kết đều hoạt động) và sử dụng STUFF cho việc này. Lưu ý mệnh đề WHERE bên trong STUFF. Đây là những gì liên kết bản ghi với các giá trị chính xác.

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  

Chỉnh sửa

OK, những gì bạn muốn (những gì bạn thực sự, thực sự muốn) là:

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ưu ý sự thay đổi ở đây. SELECT trong STUFF bây giờ là từ một truy vấn phụ, do đó bạn có thể nhóm theo Địa chỉ Email.

Giải thích bổ sung

Mục đích của bạn là có sự kết hợp của các mã sản phẩm được nhóm theo khách hàng (thể hiện bằng địa chỉ email). Vấn đề là mã sản phẩm nằm trong bảng chi tiết đơn hàng và địa chỉ email nằm trong bảng khách hàng, nhưng không có trường nào liên kết cả hai. Bảng khách hàng có mối quan hệ từ một đến nhiều với bảng đơn hàng và bảng đơn đặt hàng có mối quan hệ một đến nhiều với bảng chi tiết đơn hàng. Đó là một mức độ trừu tượng quá nhiều. Vì vậy, chúng tôi cần trợ giúp cơ sở dữ liệu bằng cách cung cấp liên kết trực tiếp giữa mã sản phẩm và địa chỉ email. Điều này chúng tôi thực hiện thông qua Truy vấn phụ. Tôi hy vọng rằng điều này làm cho nó rõ ràng hơn cho bạn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tôi có thể lặp lại tất cả các tệp trong một thư mục bằng TSQL?

  2. Giải pháp cho cách đọc tệp nhật ký giao dịch SQL Server mà không có bất kỳ lỗi nào

  3. Hợp nhất nhiều cơ sở dữ liệu thành một cơ sở dữ liệu duy nhất

  4. 7 cách trả lại tất cả các bảng bằng khóa chính trong SQL Server

  5. C # Giải mã byte từ SQL Server EncryptByPassPhrase?