栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

TSQL从两个表创建一个动态报告,一个表保存标题,另一个表保存数据

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

TSQL从两个表创建一个动态报告,一个表保存标题,另一个表保存数据

要获得所需的结果,您将需要使用该

PIVOT
函数。

如果您

title
提前知道了所有值(),则可以对静态查询进行硬编码:

select *from(    select r.Title, f.UserName, f.Value    from ReportItems r    left join FormValues f        on r.FormID = f.FormID        and r.FieldID = f.FieldID) srcpivot(    max(value)    for title in ([First Name], [Last Name], Age)) piv;

请参阅带有演示的SQL Fiddle。

但是听起来

titles
您想将其变成列的数量未知。如果真是这样,那么您将需要使用动态sql:

DECLARE @cols AS NVARCHAr(MAX),    @query  AS NVARCHAr(MAX)select @cols = STUFF((SELECT distinct ',' + QUOTENAME(Title)          from ReportItems FOR XML PATH(''), TYPE ).value('.', 'NVARCHAr(MAX)')         ,1,1,'')set @query = 'SELECt UserName,' + @cols + ' from   (     select r.Title, f.UserName, f.Value     from ReportItems r     left join FormValues f         on r.FormID = f.FormID         and r.FieldID = f.FieldID ) x pivot  (     max(value)     for Title in (' + @cols + ') ) p 'execute(@query)

参见带有演示的SQL Fiddle

两者的结果将是:

| USERNAME | FIRST NAME | LAST NAME | AGE |-------------------------------------------|   user 1 |       Mike |     Oscar |  20 ||   user 2 |      Merry |    (null) |  23 ||   user 3 |       Alen |    Escott |  28 |

如果您有需要的特定信息

SortOrder
,并且已将其存储在表中,那么在获取列列表时,将使用以下内容,并将以正确的顺序返回这些列:

select @cols = STUFF((SELECT ',' + QUOTENAME(Title)          from ReportItems         group by Title, sortorder         order by sortorder FOR XML PATH(''), TYPE ).value('.', 'NVARCHAr(MAX)')         ,1,1,'')

参见带有演示的SQL Fiddle



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/634506.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号