且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在一行中插入多个行值

更新时间:2022-10-22 20:29:58

如何:将行合并为单行?



示例:

   -   第1步 - 创建临时表 -   
IF NOT OBJECT_ID (N ' #BooksGenre' IS NULL
DROP # BooksGenre

CREATE TABLE #BooksGenre(
BookId INT NOT NULL
AuthorID INT NOT NULL
类型 NVARCHAR 50 ))

- 第2步 - 插入临时数据 -
INSERT INTO #BooksGenre([BookId],[AuthorId],[Genre])
VALUES 1 1 ' 喜剧'
INSERT INTO #BooksGenre([BookId],[AuthorId],[Genre])
VALUES 1 1 ' 幻想
INSERT INTO #BooksGenre([BookId], [AuthorId],[类型])
VALUES 1 1 ' 短篇小说'
INSERT INTO #BooksGenre([BookId],[AuthorId],[Genre])
VALUES 2 1 ' travel'
INSERT INTO #BooksGenre([BookId],[AuthorId],[Genre])
VALUES 2 1 ' guide'
INSERT INTO #BooksGenre([BookId],[AuthorId],[Genre])
VALUES 303 55 ' 科幻小说'
INSERT INTO #BooksGenre([BookId],[AuthorId],[Genre])
VALUES 303 55 ' 恐怖'
INSERT INTO #BooksGenre([BookId],[AuthorId] ],[类型])
VALUES 1015 99 ' 悲剧'
INSERT INTO #BooksGenre([BookId],[AuthorId],[Genre])
VALUES 1015 99 ' novel'
INSERT INTO #BooksGenre([BookId],[AuthorId],[Genre])
VALUES 1015 99 ' drama'

- 第3步 - 解决方案A - 使用数据透视
DECLARE @cols NVARCHAR 200
DECLARE @ subqry NVARCHAR ( 400
DECLARE @ pivqry NVARCHAR 1000

- 动态列,类型列表
SET @cols = STUFF(( SELECT DISTINCT ' ],[' + [Genre]
FROM [#BooksGenre]
ORDER BY ' ],[' + [Genre]
FOR XML PATH(' ')), 1 2 ' ' )+ ' ]'
- SELECT @cols AS [Genre]

SET @subqry = N ' SELECT [AuthorId],[BookId],[Genre]' +
' FROM [#BooksGenre]'
- EXEC(@subqry)
SET @pivqry = N ' SELECT PT。[AuthorId],[BookId],' + @cols + ' ' +
FROM(' + @ subqry + ' )AS DT' +
' PIVOT(COUNT(DT。[Genre] )FOR DT。[类型] IN(' + @cols + ' ))AS PT' +
' ORDER BY PT。 [AuthorId],[BookId]'
EXEC @ pivqry

- 第4步 - 解决方案B - 使用STUFF ... FOR XML PATH
SELECT t1。[AuthorId],t1。[BookId],STUFF(( SELECT ' ,' + [Genre] AS ' text()'
FROM #BooksGenre AS t2
WHERE t2.BookId = t1.BookId
FOR XML PATH(' ')), 1 1 ' ' AS [关键字]
FROM #BooksGenre AS t1
GROUP BY t1 。[AuthorId],t1。[BookId]


- 第5步 - 清理 -
DROP #BooksGenre


Hi to all,
In my mysql table there are 4 fields. i>id(primary) ii>patientid iii>testid iv>date.
Suppose there is a patientid 01 three times in a table but 2 records are of same date and remaining 1 is on different date. I want to select same date and same patientid record as 1 record and their testid also should come in a single row. In this case it should display 2 test id in a single column.


Example::
Id PID TestId Date
1 22 17 22/03/2013
2 22 18 22/03.2013
3 22 19 25/03/2013
4 21 17 22/03/2013

output
Id PID TestId Date
1 22 17 18 22/03/2013
2 22 19 25/03/2013
3 21 17 22/03/2013


Please help , I have stuck. Thanks in advance

How to: merge rows into single row?

Example:
-- STEP 1 - CREATE TEMPORARY TABLE --
IF NOT OBJECT_ID(N'#BooksGenre') IS NULL
	DROP TABLE #BooksGenre

CREATE TABLE #BooksGenre (
	BookId INT NOT NULL,
	AuthorID INT NOT NULL,
	Genre NVARCHAR (50))

-- STEP 2 - INSERT TEMPORARY DATA --
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1,	1,	'comedy')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1,	1,	'fantasy')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1,	1,	'short story')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (2,	1,	'traveling')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (2,	1,	'guide')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (303,	55,	'science fiction')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (303,	55,	'horror')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1015,	99,	'tragedy')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1015,	99,	'novel')
INSERT INTO #BooksGenre ([BookId], [AuthorId], [Genre])
VALUES (1015,	99,	'drama')

-- STEP 3 - SOLUTION A -- using pivot
DECLARE @cols NVARCHAR(200)
DECLARE @subqry NVARCHAR(400)
DECLARE @pivqry NVARCHAR(1000)

--dynamic columns, list of genre
SET @cols = STUFF((SELECT DISTINCT '],[' + [Genre]
					FROM [#BooksGenre]
					ORDER BY '],[' + [Genre]
			FOR XML PATH('')),1,2,'') + ']'
--SELECT @cols AS [Genre]

SET @subqry = N'SELECT [AuthorId],[BookId],[Genre] ' +
			'FROM [#BooksGenre]'
--EXEC (@subqry)
SET @pivqry= N'SELECT PT.[AuthorId], [BookId], ' + @cols + ' ' +
			'FROM (' + @subqry + ') AS DT ' +
			'PIVOT (COUNT(DT.[Genre]) FOR DT.[Genre] IN (' + @cols + ')) AS PT ' + 
			'ORDER BY PT.[AuthorId], [BookId]'
EXEC (@pivqry)

-- STEP 4 - SOLUTION B --  using STUFF ... FOR XML PATH
SELECT  t1.[AuthorId], t1.[BookId], STUFF( (SELECT ', ' + [Genre] AS 'text()' 
                  FROM #BooksGenre AS t2
                  WHERE t2.BookId = t1.BookId
                  FOR XML PATH('')), 1, 1, '') AS [Keywords]
FROM #BooksGenre AS t1
GROUP BY t1.[AuthorId], t1.[BookId]


-- STEP 5 - CLEAN UP --
DROP TABLE #BooksGenre