SQL-获取行值作为列标题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL-获取行值作为列标题相关的知识,希望对你有一定的参考价值。

我有两个表格,如下所示。我想加入这两个表,并需要将第二个表的列值设置为列标题,如下所示。我该如何实现?

表1

ID       NAME    
---------------
1        AAA
2        BBB

table2

ID         QUESTION         ANSWER     
----------------------------------
1              Q1             YES
1              Q2             NO
1              Q3             YES
1              Q4             NO
1              Q5             YES
2              Q1             YES
2              Q2             YES
2              Q3             YES
2              Q4             YES
2              Q5             YES 

输出表应该是

   ID      NAME       Q1     Q2      Q3     Q4      Q5
   ----------------------------------------------------
   1       AAA        YES    NO     YES     NO      YES
   2       BBB        YES    YES    YES     YES     YES
答案

您可以按以下方式使用Dynamic Pivot-

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

SELECT  @cols =
STUFF((SELECT   ( '],[' +  A.QUESTION)
    FROM (SELECT DISTINCT QUESTION FROM table2) A
    ORDER BY A.QUESTION 
    FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
,1,1,'')+']'
FROM table2


SET @sqlCommand= 
N'SELECT [ID],NAME,'+SUBSTRING(@cols,2,LEN(@cols))+'
FROM 
(
    SELECT A.ID,A.NAME, B.QUESTION, B.ANSWER 
    FROM table1 A
    INNER JOIN table2 B ON A.ID = B.ID
) AS P
PIVOT
(
    MAX(ANSWER)
    FOR QUESTION IN('+SUBSTRING(@cols,2,LEN(@cols))+')
) PVT'

--PRINT @sqlCommand
EXEC (@sqlCommand)
另一答案

这不是您通常要在表示层中执行的操作吗?为此使用了报告工具。

另一答案

您必须使用Pivot编写此查询:

Sample Data:

DECLARE @Table1 TABLE( id int, name nvarchar(10));
DECLARE @Table2 TABLE( id int, Question nvarchar(10),Answer nvarchar(10))

insert into @Table1 (id,[name])values(1,'AAA')
insert into @Table1 (id,[name])values(2,'BBB')


insert into @Table2 (id,Question,Answer)values(1,'Q1','YES')
insert into @Table2 (id,Question,Answer)values(1,'Q2','NO')
insert into @Table2 (id,Question,Answer)values(1,'Q3','YES')
insert into @Table2 (id,Question,Answer)values(1,'Q4','NO')
insert into @Table2 (id,Question,Answer)values(1,'Q5','YES')
insert into @Table2 (id,Question,Answer)values(2,'Q1','YES')
insert into @Table2 (id,Question,Answer)values(2,'Q2','YES')
insert into @Table2 (id,Question,Answer)values(2,'Q3','YES')
insert into @Table2 (id,Question,Answer)values(2,'Q4','YES')
insert into @Table2 (id,Question,Answer)values(2,'Q5','YES')

select * from @Table1 t1
inner join (
select * from(
select 
t2.id
,t2.Question
,t2.Answer
from @Table2 t2
)temp
pivot
    (
    MAX(Answer)
    for question in ([Q1],[Q2],[Q3],[Q4],[Q5])
    ) as PivotTable 
)TemporaryTable on t1.id=TemporaryTable.id

如果您的问题是动态的,则可以这样编写:


Declare @cols nvarchar(MAX);
Declare @query nvarchar(MAX);
    set @cols=( select STRING_AGG('['+Question+']',',') from @Table2);
    set @query='
    select * from @Table1 t1
    inner join (
    select * from(
    select 
    t2.id
    ,t2.Question
    ,t2.Answer
    from @Table2 t2
    )temp
    pivot
        (
        MAX(Answer)
        for question in ('+@cols+')
        ) as PivotTable 
    )TemporaryTable on t1.id=TemporaryTable.id
    '
    exec sp_executesql  @query

以上是关于SQL-获取行值作为列标题的主要内容,如果未能解决你的问题,请参考以下文章

获取行值作为列头

SQL - 将多个行值插入单个列

基于列值向sql中的列添加行值

根据行值填充列 BigQuery 标准 SQL

SQL查询以查找列的行值之间的最小差异

mysql选择动态行值作为列名,另一列作为值