Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Saya ingin melakukan group_concat di SQL Server

Untuk memberi Anda ilustrasi bergabung (dalam hal ini bergabung sendiri, tetapi semua bergabung berfungsi) dan menggunakan STUFF untuk ini. Perhatikan klausa WHERE di dalam STUFF. Inilah yang menghubungkan catatan dengan nilai yang benar.

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  

Sunting

OK jadi apa yang Anda inginkan (yang benar-benar Anda inginkan) adalah:

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

Perhatikan perubahannya di sini. SELECT di STUFF sekarang berasal dari sub-kueri, sehingga Anda dapat mengelompokkan menurut Alamat Email.

Penjelasan tambahan

Tujuan Anda adalah memiliki rangkaian kode produk yang dikelompokkan berdasarkan pelanggan (diwakili oleh alamat email). Masalahnya adalah kode produk ada di tabel detail pesanan dan alamat email ada di tabel pelanggan, tetapi tidak ada bidang yang menghubungkan keduanya. Tabel pelanggan memiliki hubungan satu ke banyak dengan tabel pesanan dan tabel pesanan memiliki hubungan satu ke banyak dengan tabel detail pesanan. Itu adalah satu tingkat abstraksi yang terlalu banyak. Jadi kita perlu membantu database dengan menyediakan tautan langsung antara kode produk dan alamat email. Ini kami lakukan melalui Sub-query. Saya harap ini membuatnya lebih jelas bagi Anda.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menjaga instance koneksi SQL Server tunggal terbuka untuk banyak permintaan di C #?

  2. Bagaimana sp_describe_first_result_set Bekerja di SQL Server

  3. Penggabungan yang Dikelompokkan di SQL Server

  4. Bagaimana cara menemukan duplikat di beberapa kolom?

  5. Instalasi Cluster Failover SQL Server -4