当前位置: 首页 > 面试题库 >

SQL:具有基于源表中列值的列名的动态视图

邢项禹
2023-03-14
问题内容

给定两个示例表:

门票表

ID  User    Description

0   James   This is a support ticket
1   Fred    This is a ticket too

属性表

ID  TicketID    Label           Value

0   0           Engineer        Scott
1   1           Engineer        Dale
2   0           Manu            Dell
3   1           Manu            HP
4   0           OS              Windows
5   1           OS              Linux

我如何获得这样的视图:

ID  User    Description                 Engineer    Manu    OS

1   James   This is a support ticket    Scott       Dell    Windows
2   Fred    This is a ticket too        Dale        HP      Linux

重要的是要注意,属性表并不总是相同的。一些“票证”可能具有其他人没有的属性。

这有可能吗?


问题答案:

您可以使用PIVOT执行此操作。在执行PIVOT时,可以使用以下两种方法之一进行操作:使用“静态数据透视表”(将对行进行编码)或“动态数据透视表”将在运行时创建列列表:

静态数据透视表(请参见SQL Fiddle中的Demo):

select id, [user], [engineer], [manu], [OS]
from 
(
    select t.id
        , t.[user]
        , p.ticketid
        , p.label
        , p.value
    from tickets t
    inner join properties p
        on t.id = p.ticketid
) x
pivot
(
    min(value)
    for label in ([engineer], [manu], [OS])
) p

或者,您可以使用Dynamic Pivot(请参见SQL Fiddle for
Demo
):

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX);

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(p.label) 
                    from tickets t
                    inner join properties p
                        on t.id = p.ticketid
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, [user], ' + @cols + ' from 
             (
                 select t.id
                        , t.[user]
                        , p.ticketid
                        , p.label
                        , p.value
                    from tickets t
                    inner join properties p
                        on t.id = p.ticketid
            ) x
            pivot 
            (
                min(value)
                for label in (' + @cols + ')
            ) p '

execute(@query)

这两个查询将返回相同的结果。



 类似资料:
  • 问题内容: 我正在尝试动态地旋转表,但无法获得所需的结果。这是创建表的代码 到目前为止编写的代码....这将列套和jib_in旋转为行,但这仅是两个ROWS,即我在PIVOT函数下放入聚合函数中的一个,以及我在QUOTENAME()中放入的行 我需要所有列进行旋转并显示在旋转表上。任何帮助,将不胜感激。我是动态枢纽领域的新手。我尝试了很多添加其他列的方法,但无济于事!!我知道还有其他方法,如果有其

  • 问题内容: 我正在尝试编写查询以创建数据的“表”,如下所示: 这将返回类似: 现在,我希望结果是这样的(来自MySQL查询,而不是由应用程序操纵): 有两个注意事项: 日期范围可以增加或缩小(取决于查询) 在某些情况下,PercentChange可能为null(假设category_7 / 2011-05-12可能没有设置值) 所以最终我不太确定如何构建查询的选择部分以反映动态的列数(我知道它与C

  • 问题内容: 我已经徒劳地搜索了很长时间,不得不承认失败并寻求帮助,我正在尝试修改数据透视查询,以从具有以下数据的表中生成结果的动态查询: 为了显示这样的内容,其中页码列取决于用户访问的页面数: 我已经通过对列中的硬编码进行了管理,但是显然我不想继续更改脚本以容纳越来越多的页面。 到目前为止,我有一些类似的东西: 任何帮助或正确方向的指点将不胜感激! 提前致谢! 问题答案: 我所看到的关于动态枢轴的

  • 问题内容: 我在SQL Server中使用交叉表查询时遇到问题。 假设我有以下数据: 我想查询显示结果如下: 我如何查询以显示这样的输出? 笔记: 主题名称: C C ++ 英语 数据库 数学 将根据学生学习的学科而有所不同。 请访问http://sqlfiddle.com/#!6/2ba07/1来测试此查询。 问题答案: 有两种方法可以执行对值进行硬编码的静态方法和执行时确定列的动态方法。 即使

  • 问题内容: 我正在尝试使用BCP将存储过程导出到.csv文件。它确实为我提供了.CSV格式的输出文件,但它不显示列名。下面是脚本。请看看,让我知道我在想什么 问题答案: 经过大量的跟踪和错误之后,下面是有关如何添加列的答案 首先创建一个header.txt文件(在头文件中添加所有头文件),例如,如果头文件需要名字,姓氏等 第二,将以下查询粘贴到您的存储过程中

  • 问题内容: 我可以做一个静态列表 但是,如何从数组中动态生成元素列表?我尝试了以下操作,但出现错误: 包含控制流语句的闭包不能与函数生成器“ ViewBuilder”一起使用 有什么解决办法吗?我要完成的工作是一个列表,其中包含不是静态输入的动态元素集。 问题答案: 看起来答案与将我的视图包装在其中有关 这样,我现在可以从服务器获取视图数据并进行组合。而且,仅在需要时才实例化它们。