Вступление
В этой статье мы собираемся продемонстрировать трюк TSQL только с поддержкой FOR XML.
Тематическое исследование
У нас есть три объекта таблицы
tbl_CUSTOMER
CUSTID |
CUSTNAME |
1 |
|
2 |
Чандан Баннерджи |
3 |
Soumen Bhowmik |
tbl_ITEMDTLS
ITEMCD |
НАЗВАНИЕ ПРЕДМЕТА |
100 |
Зубная паста |
101 |
Зуб Брусг |
102 |
Экономия Лосьон |
103 |
Кисть |
Теперь клиент покупает товары
tbl_SALEDTLS
SALENO |
SRLNO |
CUSTID |
ITEMCD |
201 |
1 |
1 |
100 |
201 |
2 |
1 |
101 |
201 |
3 |
1 |
102 |
201 |
4 |
1 |
103 |
202 |
1 |
2 |
100 |
202 |
2 |
2 |
101 |
203 |
1 |
3 |
100 |
Мы хотим отчет как этот формат
CUSTID |
CUSTNAME |
ПУНКТ ДЕТАЛИ |
1 |
Saving Brush, Saving Lotion, Зубной Брусг, Зубная паста |
|
2 |
Чандан Баннерджи |
Зубной брус, зубная паста |
3 |
Soumen Bhowmik |
Зубная паста |
1 |
Saving Brush, Saving Lotion, Зубной Брусг, Зубная паста |
Как это решить
-- Table Object Customer IF OBJECT_ID(N'dbo.tbl_CUSTOMER', N'U')IS NOT NULL BEGIN DROP TABLE [dbo].[tbl_CUSTOMER]; END GO CREATE TABLE [dbo].[tbl_CUSTOMER] ( CUSTID INT NOT NULL IDENTITY PRIMARY KEY, CUSTNAME VARCHAR(50) NOT NULL ); GO -- Insert Records INSERT INTO [dbo].[tbl_CUSTOMER] (CUSTNAME) VALUES('Joydeep Das'), ('Chandan Bannerjee'), ('Soumen Bhowmik'); -- Table Object Item Details IF OBJECT_ID(N'dbo.tbl_ITEMDTL', N'U')IS NOT NULL BEGIN DROP TABLE [dbo].[tbl_ITEMDTL]; END GO CREATE TABLE [dbo].[tbl_ITEMDTL] ( ITEMCD INT NOT NULL IDENTITY(100,1) PRIMARY KEY, ITEMNAME VARCHAR(50) NOT NULL ) GO -- Insert Records INSERT INTO [dbo].[tbl_ITEMDTL] (ITEMNAME) VALUES('Tooth Paste'), ('Tooth Brusg'), ('Saving Lotion'), ('Saving Brush'); -- Table Object Sales Dtls IF OBJECT_ID(N'dbo.tbl_SALEDTLS', N'U')IS NOT NULL BEGIN DROP TABLE [dbo].[tbl_SALEDTLS]; END GO CREATE TABLE [dbo].[tbl_SALEDTLS] ( SALENO INT NOT NULL, SRLNO INT NOT NULL, CUSTID INT NOT NULL, ITEMCD INT NOT NULL, CONSTRAINT PK_tbl_SALEDTLS PRIMARY KEY ( SALENO ASC, SRLNO ASC ) ) GO -- Insert Records INSERT INTO [dbo].[tbl_SALEDTLS] (SALENO, SRLNO, CUSTID, ITEMCD) VALUES(201, 1, 1, 100), (201, 2, 1, 101), (201, 3, 1, 102), (201, 4, 1, 103), (202, 1, 2, 100), (202, 2, 2, 101), (203, 1, 3, 100); GO SELECT * FROM [dbo].[tbl_CUSTOMER]; SELECT * FROM [dbo].[tbl_ITEMDTL]; SELECT * FROM [dbo].[tbl_SALEDTLS]; -- Query SELECT a.CUSTID, a.CUSTNAME, STUFF((SELECT ', '+ y.ITEMNAME FROM [dbo].[tbl_SALEDTLS] AS x INNER JOIN [dbo].[tbl_ITEMDTL] AS y ON x.ITEMCD = y.ITEMCD WHERE x.CUSTID = a.CUSTID ORDER BY ',' + y.ITEMNAME FOR XML PATH('')),1,1,'') AS [ITEM DETAILS] FROM [dbo].[tbl_CUSTOMER] AS a;
CUSTID |
CUSTNAME |
ПУНКТ ДЕТАЛИ |
1 |
Saving Brush, Saving Lotion, Зубной Брусг, Зубная паста |
|
2 |
Чандан Баннерджи |
Зубной брус, зубная паста |
3 |
Soumen Bhowmik |
Прошлое Зуба |