SQL 带字符串连接的服务器数据透视表

SQL Server pivot with string concatenation

我有如下数据

| Name      | Subject   | Answer                |
|:----------|:----------|:---------------------:|
|Pranesh    |Physics    |Numerical Problems     |
|Pranesh    |Physics    |Other                  |
|Pranesh    |Chemistry  |Understanding Concepts |
|Pranesh    |Chemistry  |Organic chemistry reactions
|Pranesh    |Maths      |Lack of understanding  |
|Pranesh    |Maths      |Insufficient practice  |
|Pranesh    |Maths      |Other                  |

使用此 SQL 查询:

select * 
from 
    (select  
         l.FullName Name, sq.Title Subject, cAns.Name Answer 
     from 
         Answer as sa
     left join
         Question AS sq on sq.ID = sa.QuestionID
     left join 
         Master as cAns on cAns.ID = sa.AnswerID
     left join 
         Profile as l on l.ID = sa.ProfileID) src
pivot
    (max(Answer)
        for Subject in ([Physics], [Chemistry], [Maths], [Biology],[ComputerScience], [CommonUnderstanding])) piv;

我可以得到如下数据

如何连接相同主题的答案栏并像上面的屏幕截图一样显示?

试试这个:-

SELECT ANS, PHYSICS,CHEMISTRY,MATHS
FROM
(
SELECT  L.FULLNAME NAME, SQ.TITLE SUBJECT, CANS.NAME ANSWER FROM ANSWER AS SA
LEFT JOIN QUESTION AS SQ ON SQ.ID = SA.QUESTIONID
LEFT JOIN MASTER AS CANS ON CANS.ID = SA.ANSWERID
LEFT JOIN PROFILE AS L ON L.ID = SA.PROFILEID
) AS T
UNPIVOT
(
  COMBINE_COLUMN_VALUES FOR ANS IN (ANSWER)
) AS U
PIVOT
(
  MAX(COMBINE_COLUMN_VALUES) FOR [SUBJECT] IN (PHYSICS,CHEMISTRY,MATHS)
) AS P

我首先按姓名和主题连接了答案列表,然后应用了旋转 -

declare @temp table (name varchar(100), subject varchar(100), answer varchar(100))

insert into @temp
            select 'Pranesh','Physics'  ,'Numerical Problems'
union all   select 'Pranesh','Physics'  ,'Other'
union all   select 'Pranesh','Chemistry','Understanding Concepts'
union all   select 'Pranesh','Chemistry','Organic chemistry reactions'
union all   select 'Pranesh','Maths'    ,'Lack of understanding'
union all   select 'Pranesh','Maths'    ,'Insufficient practice'
union all   select 'Pranesh','Maths'    ,'Other'
union all   select 'Ramesh','Biology'   ,   'Other'
union all   select 'Ramesh','Biology'   ,   'Science'

;with cte as (select distinct name, subject from @temp)
select * from
(
    select
        c.name,
        c.subject,
        answer = stuff((select ',' + answer from @temp t where t.name=c.name and t.subject=c.subject for xml path('')), 1, 1, '')
    from cte c
) src
pivot
(
    max(answer) for subject in ([Physics], [Chemistry], [Maths], [Biology],[ComputerScience],[CommonUnderstanding])
) piv