Данные из вопросов и ответов, связанных с клиентом - PullRequest
0 голосов
/ 07 мая 2019

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

Sectiontable

      SecID    SecName
      1        Box
      2        square
      3        circle
CustomerTable     
     CID      CName
     92        John
     93        Andrew
     94        Chris
TestTable     
    testID      testkey    SecID
    18             T1        1
    19             T11       1
    21             T2        2 
    22             T21       2
    34             T3        3
    35             T4        3 

  CustomerTestresponse

    responseID      CID     testID     responseText
    1                92        18        T1Text
    2                92        19        T11Text
    3                92        34        T3Text
    4                92        35        T4Text
    5                92        22        T21Text
    6                93        19        Myresponse
    7                93        34        vendor
    8                93        21        cutomerout 

Ожидаемый результат запроса:

CID    T1KeyResponse  T11KeyResponse   T3KeyResponse     T4KeyResponse
92      T1Text         T11Text           T3Text          T4Text
93                     Myresponse        vendor

1 Ответ

1 голос
/ 07 мая 2019

Это ЧЕТЫРЕ (4) пошаговых решения

- адаптировано с большим почтением от https://dba.stackexchange.com/questions/119844/how-to-pivot-without-fixed-columns-in-tsql

- (1) Объявить переменные

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

- (2) Объединить список новых заголовков столбцов, используя FOR XML PATH и STUFF:
- смотрите, где SecID <> 2 (вы можете изменить это)

SELECT @cols = 
STUFF(
        (SELECT DISTINCT
             ',' + QUOTENAME(t.testkey + 'KeyResponse')
          FROM qandrResponse as r
          Left Join qandrTest as t
          On r.testID = t.testID  
          Where SecID <> 2      -- you may want to filter differently
          Order By ',' + QUOTENAME(t.testkey + 'KeyResponse')
                    FOR XML PATH(''), TYPE
         ).value('.', 'NVARCHAR(MAX)') 
                ,1,1,''
    );  
-- Select @cols;  -- uncomment to see the list, drag right side open to see full list

- (3) Создайте полную строку sql, которая будет выполняться, используя @cols сверху

set @query
    = N'SELECT CID,  ' + @cols + N' 
        From  (SELECT
                   r.CID
                  ,t.testkey + ''' + 'KeyResponse' + N''' as Keys
                  ,responseText
              FROM qandrResponse as r
              Left Join qandrTest as t
              On r.testID = t.testID
              ) x
  Pivot (
    max(responseText) for Keys IN (' + @cols + N')
  ) as p';
-- Select @query;  -- uncomment to see sql,  prettyprint with http://www.dpriver.com/pp/sqlformat.htm

- (4) Выполнить запрос

exec sp_executesql @query 

- Результаты

--CID   T11KeyResponse  T1KeyResponse   T3KeyResponse   T4KeyResponse
--92    T11Text         T1Text          T3Text          T4Text
--93    Myresponse      NULL            vendor          NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...