【问题标题】:Is there an easy way with (T-)SQL to transform rows into columns like this?(T-)SQL 是否有一种简单的方法可以将行转换为这样的列?
【发布时间】:2016-06-05 16:58:54
【问题描述】:

假设我有 3 张桌子,例如

       Questions 
========================
 id |     qtext 
========================
 1  | "What is 3 x 23?"
------------------------
 2  | "Your age?"

      Registrants
========================
 id |    name 
========================
 1  | "Jason" 
------------------------
 2  | "Subhasish"

               Answers
======================================
 registrant_id | question_id  | val 
======================================
      1        |       1      |  69
--------------------------------------
      2        |       2      |  45
--------------------------------------
      1        |       2      |  26

有没有办法从这个表中创建一个像

                  AnswersByPartner
==================================================
     Name     |   "What is 3 x 23?" | "Your age?"
==================================================
   "Jason"    |         69          |    26
--------------------------------------------------
  "Subhasish" |        NULL         |    45

【问题讨论】:

标签: sql asp.net sql-server tsql database-design


【解决方案1】:

我一直喜欢这样:

select
   R.name as Name, 
   A1.val as [What is 3 x 23?],
   A2.val as [Your age?]
from Registrants R
left join Answers A1 on R.id = A1.registrant_id and A1.question_id = 1
left join Answers A2 on R.id = A2.registrant_id and A2.question_id = 2

【讨论】:

    【解决方案2】:

    是的!给你(请检查列名是否有错别字):

    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);
    
    SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.qtext) 
                FROM Questions c
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    
    set @query = 'SELECT Name, ' + @cols + ' from 
                (
                    select r.name, a.val,q.qtext from
                    registrants r               
                    inner join answers a
                    on r.id = a.registrant_id
                    inner join questions q
                    on q.id = a.question_id
               ) x
                pivot 
                (
                     max(val)
                    for qtext in (' + @cols + ')
                ) p '
    
    
    execute(@query)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      • 1970-01-01
      • 1970-01-01
      • 2010-09-06
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      相关资源
      最近更新 更多