Ví dụ của bạn gần giống với tính năng xoay vòng, nhưng tôi không nghĩ rằng chức năng xoay vòng có thể sử dụng được trên cái này.
Tôi đã đổi tên ví dụ của bạn thành "phòng ban", thay vì "phụ huynh", chỉ để giữ sự tỉnh táo của tôi.
Vì vậy, các bảng đầu tiên và một số dữ liệu
DECLARE @Department TABLE
(
DepartmentID int
,DepartmentName varchar(50)
)
DECLARE @Person TABLE
(
PersonID int
,PersonName varchar(50)
,DepartmentID int
)
INSERT INTO @Department
( DepartmentID, DepartmentName )
SELECT 1, 'Accounting' UNION
SELECT 2, 'Engineering' UNION
SELECT 3, 'Sales' UNION
SELECT 4, 'Marketing' ;
INSERT INTO @Person
( PersonID, PersonName, DepartmentID )
SELECT 1, 'Lyne', 1 UNION
SELECT 2, 'Damir', 2 UNION
SELECT 3, 'Sandy', 2 UNION
SELECT 4, 'Steve', 3 UNION
SELECT 5, 'Brian', 3 UNION
SELECT 6, 'Susan', 3 UNION
SELECT 7, 'Joe', 4 ;
Bây giờ tôi muốn làm phẳng mô hình, tôi sẽ sử dụng bảng tạm thời vì tôi có các biến bảng - nhưng chế độ xem trên "bảng thực" cũng sẽ tốt.
/* Create a table with:
DepartmentID, DepartmentName, PersonID, PersonName, PersonListIndex
This could be a view instead of temp table.
*/
IF object_id('tempdb.dbo.#tmpTbl','U') IS NOT NULL
DROP TABLE #tmpTbl
;
WITH prs
AS ( SELECT PersonID
,PersonName
,DepartmentID
,row_number() OVER ( PARTITION BY DepartmentID ORDER BY PersonID ) AS [PersonListIndex]
FROM @Person
),
dptprs
AS ( SELECT d.DepartmentID
,d.DepartmentName
,p.PersonID
,p.PersonName
,p.PersonListIndex
FROM @Department AS d
JOIN prs AS p ON p.DepartmentID = d.DepartmentID
)
SELECT * INTO #tmpTbl FROM dptprs
-- SELECT * FROM #tmpTbl
Cột động có nghĩa là truy vấn động, tôi sẽ soạn từng hàng một thành một bảng
/* Table to compose dynamic query */
DECLARE @qw TABLE
(
id int IDENTITY(1, 1)
,txt nvarchar(500)
)
/* Start composing dynamic query */
INSERT INTO @qw ( txt ) VALUES ( 'SELECT' )
INSERT INTO @qw ( txt ) VALUES ( '[DepartmentID]' )
INSERT INTO @qw ( txt ) VALUES ( ',[DepartmentName]' ) ;
/* fetch max number of employees in a department */
DECLARE @i int ,@m int
SET @m = (SELECT max(PersonListIndex) FROM #tmpTbl)
/* Compose dynamic query */
SET @i = 1
WHILE @i <= @m
BEGIN
INSERT INTO @qw ( txt )
SELECT ',MAX(CASE [PersonListIndex] WHEN '
+ cast(@i AS varchar(10)) + ' THEN [PersonID] ELSE NULL END) AS [Person_'
+ cast(@i AS varchar(10)) + '_ID]'
INSERT INTO @qw ( txt )
SELECT ',MAX(CASE [PersonListIndex] WHEN '
+ cast(@i AS varchar(10)) + ' THEN [PersonName] ELSE NULL END) AS [Person_'
+ cast(@i AS varchar(10)) + '_Name]'
SET @i = @i + 1
END
/* Finish the dynamic query */
INSERT INTO @qw (txt) VALUES ( 'FROM #tmpTbl' )
INSERT INTO @qw (txt) VALUES ( 'GROUP BY [DepartmentID], [DepartmentName]' )
INSERT INTO @qw (txt) VALUES ( 'ORDER BY [DepartmentID]' )
-- SELECT * FROM @qw
Và bây giờ, hãy nối tất cả các hàng truy vấn thành một biến và thực thi
/* Create a variable with dynamic sql*/
DECLARE @exe nvarchar(4000)
SET @exe=''
SELECT @exe = @exe + txt + ' ' FROM @qw ORDER BY id
/* execute dynamic sql */
EXEC master..sp_executesql @exe
Và đây là kết quả: