Как повернуть данные SQL? - PullRequest
       24

Как повернуть данные SQL?

0 голосов
/ 09 января 2019

У меня есть набор данных, связанных с опросами, и я должен создать для них представление. Набор данных имеет формат:

surveyID    RID    Question   Answer     Comment
-----------------------------------------------------------------
17     |   123  |   Q1     |   0      |
17     |   123  |   Q2     |          |   The salesperson and manager was very considerate and I will be coming back for my next car!
17     |   123  |   Q3     |   5      |   Very bad behavior

Требуемый результат:

surveyID |   RID  |  Q1  |  Q1_c |  Q2  |  Q2_c  |  Q3  |  Q3_c 
-----------------------------------------------------------------
17       |   123  |  0   |       |      | The... |  5   | Very...

Комментарий к Вопросам и вопросам должен находиться в строке заголовка, как указано выше:

Я пытался получить результат, но у меня все получилось, только если я поворачиваюсь на 1 столбец, т. Е. На столбец «Ответ», но как изменить столбцы «Ответ» и «Комментарий» одновременно?

Это запрос, который я сделал

select rid, surveyid, --comment,    
    Q1,Q2,Q3
from
(
  select rid, surveyid, question, --comment,    
    value
  from
  (
    select rid, surveyid, question, -- comment,
      answer      
    from #temp
  ) s
  unpivot
  (
    value
    for col in (answer)
  ) un
) src
pivot
(
  max(value)
  for question in (Q1, Q2, Q3)
) piv

И результат такой:

surveyID |   RID  |  Q1  |  Q2  |  Q3  |  
-----------------------------------------------------------------
17       |   123  |  0   |      |  5   | 

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Когда вы отменяете данные, вы можете объединить столбцы вопросов и столбцов в один столбец для использования в операции сводки следующим образом:

select * from (
  select surveyid, rid, question+'_'+col QC, value from (
    select rid, surveyid, question, Comment,
      cast(answer as varchar(91)) Answer
    from #temp
  ) s
  unpivot
  (
    value
    for col in (Answer, Comment)
  ) un
  ) src
 pivot
(
  max(value)
  for QC in (Q1_Answer, Q1_Comment, Q2_Answer, Q2_Comment, Q3_Answer, Q3_Comment)
) piv

Вы можете получить желаемые заголовки столбцов с некоторыми незначительными изменениями:

select * from (
  select surveyid, rid, question+case col when 'comment' then '_c' end QC, value from (
    select rid, surveyid, question, Comment,
      cast(answer as varchar(91)) Answer
    from #temp
  ) s
  unpivot
  (
    value
    for col in (Answer, Comment)
  ) un
  ) src
 pivot
(
  max(value)
  for QC in (Q1, Q1_C, Q2, Q2_C, Q3, Q3_C)
) piv
0 голосов
/ 10 января 2019

Вот еще одна альтернатива, поскольку в SQL Server нет простого способа выполнить многоколоночную сводку с помощью оператора сводки, вы всегда можете вернуться к выполнению сводной операции с ручным кодированием "

select surveyID, rid
     , max(case question when 'Q1' then answer end) q1
     , max(case question when 'Q1' then comment end) q1_c
     , max(case question when 'Q2' then answer end) q2
     , max(case question when 'Q2' then comment end) q2_c
     , max(case question when 'Q3' then answer end) q3
     , max(case question when 'Q3' then comment end) q3_c
  from #temp
 group by surveyID, rid

На самом деле он более компактен, чем другие представленные варианты, и, возможно, имеет лучшую производительность, хотя вам нужно проверить это утверждение для себя.

0 голосов
/ 09 января 2019

Я разделил запрос на два одинаковых центра, свел данные в CTE, а затем соединил CTE вместе.

;WITH QnA AS
(
    SELECT
        RID
        ,surveyID
        ,Q1
        ,Q2
        ,Q3
    FROM
    ( SELECT RID, surveyID, Question, Answer FROM #temp ) src
    PIVOT
    (
        MAX(Answer)
        FOR Question IN ( Q1
            ,Q2
            ,Q3
        )
    ) piv
)
,QnAComments AS
(
    SELECT
        RID
        ,surveyID
        ,Q1_c = Q1
        ,Q2_c = Q2
        ,Q3_c = Q3
    FROM
    ( SELECT RID, surveyID, Question, Comment FROM #temp ) src
    PIVOT
    (
        MAX(Comment)
        FOR Question IN ( Q1
            ,Q2
            ,Q3
        )
    ) piv
)
SELECT
    QnA.surveyID
    ,QnA.RID
    ,Q1
    ,Q1_c
    ,Q2
    ,Q2_c
    ,Q3
    ,Q3_c
FROM QnA
INNER JOIN QnAComments ON QnAComments.RID = QnA.RID
                           AND QnAComments.surveyID = QnA.surveyID
...