如何在MS SQL中透视表 [英] How to Pivot a Table in MS SQL

查看:71
本文介绍了如何在MS SQL中透视表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

 选择 Floorno,RoomNo 来自楼层





 First_Floor 101 
First_Floor 102
Second_Floor 201
Second_Floor 202
Third_Floor 301
Third_Floor 302



*************************** ***********



我想把这张桌子显示为

 First_Floor 101 102 
Second_Floor 201 202
Third_Floor 301 302





请填写完整查询。

解决方案

试试吧:

1)静态版本:

  DECLARE   @ rooms   TABLE (Floorno  VARCHAR  30 ),RoomNo  INT 

INSERT INTO @ rooms (Floorno,RoomNo)
SELECT ' First_Floor' 101
UNION ALL SELECT ' First_Floor' 102
UNION ALL SELECT ' Second_Floor' 201
UNION ALL SELECT ' Second_Floor' 202
UNION ALL SELECT ' Third_Floor' 301
UNION ALL SELECT ' Third_Floor' 302

SELECT Floorno,[ 1 ],[ 2 ]
FROM
SELECT Floorno,RoomNo,ROW_NUMBER() OVER PARTITION BY Floorno 订购 BY Floorno,RoomNo) AS RoomID
FROM @ rooms
AS DT
PIVOT(MAX(RoomNo) FOR RoomID IN ([ 1 ],[ 2 ])) AS PT





结果:

 Floorno 1 2 
------ ----------------------
First_Floor 101 102
Second_Floor 201 202
Third_Floor 301 302





2)动态版

 创建  TABLE  #rooms(Floorno  VARCHAR  30 ),RoomNo  INT 

INSERT INTO #rooms(Floorno,RoomNo)
SELEC T ' First_Floor' 101
UNION ALL SELECT ' First_Floor' 102
UNION ALL SELECT ' Second_Floor' 201
UNION ALL SELECT ' Second_Floor' 202
UNION ALL SELECT ' Third_Floor' 301
UNION ALL SELECT ' Third_Floor' 302
UNION ALL SELECT ' Third_Floor' 303

DECLARE @cols VARCHAR 300
DECLARE @ dt VARCHAR 2000
DECLARE @ pt < /秒pan> VARCHAR (MAX)

SET @cols = STUFF(( SELECT DISTINCT ' ],[' + CONVERT NVARCHAR 10 ),O。[RoomID])
FROM
SELECT ROW_NUMBER() OVER PARTITION BY Floorno ORDER BY Floorno,RoomNo) AS RoomID
FROM #rooms
AS O
ORDER BY ' ],[' + CONVERT NVARCHAR 10 ),O。[RoomID])
FOR XML PATH(' ')), 1 2 ' ')+ ' ]'


SET @ dt = N ' SELECT Floorno,RoomNo,ROW_NUMBER()OVER(Floorno ORDER BY Floorno,RoomNo分区)AS RoomID
来自#rooms'

SET @ pt = N ' SE LECT Floorno,' + @cols + ' ' +
' FROM(' + @ dt + ' )AS DT' +
< span class =code-string>'
PIVOT(MAX(RoomNo)FOR RoomID IN(' + @cols + ' ))AS PT'

< span class =code-keyword> EXEC ( @ pt

DROP TABLE #rooms





结果:

 Floorno 1 2 3 
----------------------------- -------
First_Floor 101 102 NULL
Second_Floor 201 202 NULL
Third_Floor 301 302 303


select Floorno,RoomNo from floor



First_Floor	101
First_Floor	102
Second_Floor	201
Second_Floor	202
Third_Floor	301
Third_Floor	302


**************************************

I want to show this table as

First_Floor   101   102
Second_Floor  201   202
Third_Floor   301   302



Please Write the Full Query.

解决方案

Try it:
1) Static version:

DECLARE @rooms TABLE (Floorno VARCHAR(30),RoomNo INT)

INSERT INTO @rooms (Floorno ,RoomNo)
SELECT 'First_Floor', 101
UNION ALL SELECT 'First_Floor', 102
UNION ALL SELECT 'Second_Floor', 201
UNION ALL SELECT 'Second_Floor', 202
UNION ALL SELECT 'Third_Floor', 301
UNION ALL SELECT 'Third_Floor', 302

SELECT Floorno, [1], [2]
FROM (
	SELECT Floorno ,RoomNo, ROW_NUMBER() OVER (PARTITION BY Floorno ORDER BY Floorno, RoomNo) AS RoomID
	FROM @rooms
	) AS DT
PIVOT(MAX(RoomNo) FOR RoomID IN([1],[2])) AS PT



Result:

Floorno          1       2
----------------------------
First_Floor	101	102
Second_Floor	201	202
Third_Floor	301	302



2) Dynamic version

CREATE TABLE #rooms (Floorno VARCHAR(30),RoomNo INT)

INSERT INTO #rooms (Floorno ,RoomNo)
SELECT 'First_Floor', 101
UNION ALL SELECT 'First_Floor', 102
UNION ALL SELECT 'Second_Floor', 201
UNION ALL SELECT 'Second_Floor', 202
UNION ALL SELECT 'Third_Floor', 301
UNION ALL SELECT 'Third_Floor', 302
UNION ALL SELECT 'Third_Floor', 303

DECLARE @cols VARCHAR(300)
DECLARE @dt VARCHAR(2000)
DECLARE @pt VARCHAR(MAX)

SET @cols = STUFF((SELECT DISTINCT '],[' + CONVERT(NVARCHAR(10),O.[RoomID])
					FROM (
						SELECT ROW_NUMBER() OVER (PARTITION BY Floorno ORDER BY Floorno, RoomNo) AS RoomID
						FROM #rooms
					) AS O
					ORDER BY '],[' + CONVERT(NVARCHAR(10),O.[RoomID])
			FOR XML PATH('')),1,2,'') + ']'


SET @dt = N'SELECT Floorno ,RoomNo, ROW_NUMBER() OVER (PARTITION BY Floorno ORDER BY Floorno, RoomNo) AS RoomID
		FROM #rooms'
SET @pt = N'SELECT Floorno, ' + @cols + ' ' +
	'FROM (' + @dt +  ') AS DT ' +
	'PIVOT(MAX(RoomNo) FOR RoomID IN(' + @cols + ')) AS PT'

EXEC(@pt)

DROP TABLE #rooms



Result:

Floorno          1       2       3
------------------------------------
First_Floor	101	102	NULL
Second_Floor	201	202	NULL
Third_Floor	301	302	303


这篇关于如何在MS SQL中透视表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆