Сводная таблица SQL по текстовому значению - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь развернуть следующий набор данных в SQL.

SELECT  ParticipantID,
        ContactReasonTypeID,
        Completed = CASE WHEN Returned IS NOT NULL
                        THEN    'Completed'
                        ELSE 'Not completed'
                    END
FROM    ContactReason
WHERE   ContactReasonTypeID = 40 -- M4
UNION
SELECT  ParticipantID,
        ContactReasonTypeID,
        Completed = CASE WHEN Returned IS NOT NULL
                        THEN    'Completed'
                        ELSE 'Not completed'
                    END
FROM    ContactReason
WHERE   ContactReasonTypeID = 80 -- M8

Что дает следующий результат:

ParticipantID | QuestionnaireID  | Completed
1               40                 'Completed'
1               80                 'Not completed'
2               40                 'Completed'
2               80                 'Completed'
3               40                 'Completed'
3               80                 'Not completed'
4               40                 'Completed'
4               80                 'Not completed'

То, что я хотел бы, чтобы результаты отображались следующим образом (где M4 - это вопросник ID 40, а М8 - 80):

ParticipantID | M4           | M8
1               'Completed'    'Not completed'
2               'Completed'    'Completed'
3               'Completed'    'Not completed'
4               'Completed'    'Not completed'

Я изо всех сил пытаюсь повернуть стол. Мой текущий SQL выглядит следующим образом и приводит к ошибкам. Я пытался переключаться между столбцами на основе других сообщений, но не могу понять, что нужно:

SELECT  *
FROM    (
    SELECT  ParticipantID,
            ContactReasonTypeID,
            Completed = CASE WHEN Returned IS NOT NULL
                            THEN    'Completed'
                            ELSE 'Not completed'
                        END
    FROM    ContactReason
    WHERE   ContactReasonTypeID = 40
    UNION
    SELECT  ParticipantID,
            ContactReasonTypeID,
            Completed = CASE WHEN Returned IS NOT NULL
                            THEN    'Completed'
                            ELSE 'Not completed'
                        END
    FROM    ContactReason
    WHERE   ContactReasonTypeID = 80
) AS tbl
PIVOT (
    MAX(Returned)
    FOR ContactReasonTypeID IN ([M4],[M8])
) AS pvt
ORDER BY ParticipantID

Ответы [ 3 ]

0 голосов
/ 03 сентября 2018

Вы можете попробовать это:

SELECT q.ParticipantID, 
                  CASE WHEN min(q.QuestionnaireID) = 40
                        THEN min(q.Completed)
                    END as M4,
                   CASE WHEN max(q.QuestionnaireID) = 80
                        THEN max(q.Completed)
                    END as M8
  FROM
(
SELECT  ParticipantID,
        ContactReasonTypeID,
        Completed = CASE WHEN Returned IS NOT NULL
                        THEN    'Completed'
                        ELSE 'Not completed'
                    END
FROM    ContactReason
WHERE   ContactReasonTypeID = 40 -- M4
UNION
SELECT  ParticipantID,
        ContactReasonTypeID,
        Completed = CASE WHEN Returned IS NOT NULL
                        THEN    'Completed'
                        ELSE 'Not completed'
                    END
FROM    ContactReason
WHERE   ContactReasonTypeID = 80
) q
GROUP BY ParticipantID;

Внутри Демо , рассмотрим внутренний запрос q как tab2.

0 голосов
/ 03 сентября 2018

Вы можете использовать команду PIVOT для этого

DECLARE @t table(ParticipantID INT, QuestionnaireID INT, Completed varchar(20))
INSERT @t values
(1,40,'Completed'),(1,80,'Not completed'),(2,40,'Completed'),
(2,80,'Completed'),(3,40,'Completed'),(3,80,'Not completed'),
(4,40,'Completed'),(4,80,'Not completed')


SELECT ParticipantID, [40] M4, [80] M8
FROM @t
PIVOT
  (min(COMPLETED)  
FOR QuestionnaireID
  in([40],[80])  
)AS p
ORDER BY ParticipantID

Результат:

ParticipantID   M4          M8
1               Completed   Not completed
2               Completed   Completed
3               Completed   Not completed
4               Completed   Not completed
0 голосов
/ 03 сентября 2018

Вы можете попробовать следующий код:

SELECT  DISTINCT CR.ParticipantID,
        (SELECT CASE
                    WHEN Returned IS NOT NULL
                    THEN 'Completed'
                    ELSE 'Not completed'
                END M4
           FROM ContactReason
          WHERE ContactReasonTypeID = 40 --M4
            AND ParticipantID = CR.ParticipantID) M4,
        (SELECT CASE
                    WHEN Returned IS NOT NULL
                    THEN 'Completed'
                    ELSE 'Not completed'
                END M4
           FROM ContactReason
          WHERE ContactReasonTypeID = 80 --M8
            AND ParticipantID = CR.ParticipantID) M8
FROM    ContactReason CR
WHERE   CR.ContactReasonTypeID IN (40, 80) -- M4 and M8
...