Jon*_*s T 5 sql pivot pivot-table sql-server-2008
我正在使用 SQL Server 2008。
我有两张桌子
User( UserID, Name, Link)UserNotes( NoteID, UserID, Title, Description)这是示例数据结构。
INSERT INTO [User]
([UserID], [Name], [Link])
VALUES
(1, 'John', 'L1'),
(2, 'Steve', 'L234');
INSERT INTO [UserNotes]
([NoteID], [UserID], [Title], [Description])
VALUES
(1, 1, 'AboutJohn', 'This is about john'),
(2, 1, 'John Work', 'This is where John work'),
(3, 1, 'John Education', 'This is the uni where John go'),
(4, 2, 'Steve Note1', 'Des1 about Steve'),
(5, 2, 'Steve Note2', 'Des2 about Steve');
Run Code Online (Sandbox Code Playgroud)
这是SQL 小提琴
我想User_view按如下方式创建视图 ( ),当我执行此命令时,输出应如下所示。
SELECT * FROM User_view WHERE UserID IN (1)
UserID Name AboutJOhn JohnWork JohnEducation
1 John This is about john This is where Johnwork This is the uni where John go
Run Code Online (Sandbox Code Playgroud)
Title子表的列应该成为列名并Description应该成为该列的值,我们不知道我们将有多少行。当我们选择两个用户以及使用哪个名称的列名时,我意识到了这个问题。在这种情况下,我们可以使用(Note1、Note2、Note3 等用于多个用户),否则使用标题字段作为列名。有可能这样做吗?干杯!
这不是一个视图..这是一个将返回您想要的结果的过程
你可以称之为
proc_UserNotes 1
proc_UserNotes 2
ETC
CREATE procedure proc_UserNotes (@UserID int)
as
begin
DECLARE @cols AS NVARCHAR(MAX),
@cols_WITH_MAX AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
select @cols_WITH_MAX = STUFF((SELECT distinct ',MAX('
+ QUOTENAME(Title) +') AS ' + QUOTENAME(Title)
from [UserNotes] where UserID =@UserID
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Title)
from [UserNotes] where UserID =@UserID
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT [UserID], '+ @cols_WITH_MAX +' FROM(
SELECT [UserID], ' + @cols + ' from
(
SELECT * FROM
[UserNotes] where UserID ='+cast(@UserID as varchar(20)) +'
)X
pivot
(
MAX([Description])
for [Title] in (' + @cols + ')
) p )a GROUP BY [UserID]'
print(@query)
execute(@query)
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4375 次 |
| 最近记录: |