Статьи

Трюк TSQL только с поддержкой FOR XML

Вступление

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

 Прошлое Зуба