Вступление
В этой статье мы собираемся продемонстрировать трюк 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 |
Прошлое Зуба |