【问题标题】:How to replace column names with a value of another table如何用另一个表的值替换列名
【发布时间】:2021-06-16 16:30:29
【问题描述】:

我有如下表A:

ID  QuestionCode   Question
1    Q1            What is your name
2    Q2            How old are you
3    Q3            Where are you from

另外,我有如下表 B:

UserId  Q1     Q2   Q3
1       Ahmad  22   Egypt
2       John   31   USA
3       Daniel 32   Mexico

我想要的是使用问题本身而不是列名中的代码创建一个视图,例如:

UserId    What Is Your Name    How old are you    Where are you from
1         Ahmad                22                 Egypt
2         John                 31                 USA
3         Daniel               32                 Mexico

最好的方法是什么?任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: sql sql-server sql-server-2016


    【解决方案1】:

    更新...错过了 2016 年的标签

    SQL Server 在设计上是声明性的,不支持宏替换。 这留下了动态 SQL。

    这是一个动态 SQL 的工作示例

    Declare @tsql nvarchar(max) = N'Select top 1 * from Answers 
    
    Select @tsql = 'Select '+stuff((Select ',' +expr From (
                                                          select expr=concat(coalesce(quotename(Question),Name),'=',Name)
                                                           From  sys.dm_exec_describe_first_result_set(@tsql,null,null )   A
                                                           Left Join Questions B on B.QuestionCode=A.name
                                                          ) src For XML Path ('')),1,1,'')+' From Answers'
     
    Exec(@tsql)
    

    结果

    【讨论】:

      【解决方案2】:

      您所描述的枢轴在直接 SQL 中并不容易;您可以编写一些动态 SQL 来根据第一个表为第二个表创建列名和子查询,但是这样做可能相当繁琐,而且如果您弄错了,这肯定是一种简单的方法。

      https://www.red-gate.com/simple-talk/sql/t-sql-programming/easier-way-pivoting-data-sql-server/; 突出显示了另一种方法,它是否比动态 SQL 选项更简单,很大程度上取决于您的经验水平。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-24
        • 1970-01-01
        • 2021-06-16
        • 1970-01-01
        • 2020-03-20
        • 1970-01-01
        • 1970-01-01
        • 2013-08-26
        相关资源
        最近更新 更多