База данных запросов для получения данных по уникальному идентификатору - PullRequest
0 голосов
/ 20 июня 2019

У меня есть таблица базы данных со следующей информацией (не против CreatedDates, не совпадающих, это тестовая таблица базы данных):

enter image description here

Я хочу иметь возможность создать запрос к Intents и соответствующим Transcript на основе ContactId (их несколько для одного пользователя).

На данный момент мне удалось выполнить извлечение Intents пользователем (отдельно) со следующим:

SELECT distinct [ContactId],[Intents] = 
    STUFF((SELECT ' ,' + LTRIM(RTRIM(Intent))
           FROM ACCOUNT_DATA b
           WHERE b.ContactId = a.ContactId
          FOR XML PATH('')), 1, 2, '')
FROM ACCOUNT_DATA a
GROUP BY ContactId;

Мой желаемый результат будет примерно таким:

Запрос => Выбрать всех пользователей из базы данных (отдельно) и вернуть Intents (Distinct) + Transcript data и количество намерений. Так как:

d463d996-78cc-428e-8a76-e4875e1c8ff4
RescheudleApt (4) : Reschuedle Appointment, Ok, what date?, Ok, what date?,Ok, what date?
ConfirmAppt (2): Confirm my appointment, ok your appointment has been confirmed

И так далее, и так далее для каждого ContactId в таблице, как мне поступить, и я на правильном пути?

Я знаю, что это будет отформатировано в разных таблицах псевдонимов, таких как ContactId, Count, Transcript.

1 Ответ

0 голосов
/ 21 июня 2019

Попробуйте изменить запрос следующим образом:

SELECT 
    ContactId,
    Intent + ' (' + CONVERT(VARCHAR,COUNT(Intent)) + ')' as Intents, 
    [Transcript] = STUFF((SELECT ' ,' + LTRIM(RTRIM(b.Transcript))
                          FROM ACCOUNT_DATA b
                          WHERE b.ContactId = a.ContactId
                            AND b.Intent = a.Intent
                          FOR XML PATH('')), 1, 2, '')
FROM 
    ACCOUNT_DATA a
GROUP BY 
    ContactId, Intent
ORDER BY 
    ContactId

Вот демоверсия

или если вы хотите объединить Intent и Transcript

SELECT 
    ContactId,
    Intent + ' (' + CONVERT(VARCHAR,COUNT(Intent)) + ') : ' +
        STUFF((SELECT ' ,' + LTRIM(RTRIM(b.Transcript))
               FROM ACCOUNT_DATA b
               WHERE b.ContactId = a.ContactId
                 AND b.Intent = a.Intent
               FOR XML PATH('')), 1, 2, '') AS "Intent + Transcript"
FROM
    ACCOUNT_DATA a
GROUP BY 
    ContactId, Intent
ORDER BY 
    ContactId

Редактировать: последний запрос

SELECT DISTINCT ContactId, [Transcript]=STUFF((SELECT '; ' + IntentTranscript
           FROM (
                    SELECT a.ContactId,
                        a.Intent + ' (' + CONVERT(VARCHAR,COUNT(a.Intent)) + ') : ' +
                        STUFF((SELECT ' ,' + LTRIM(RTRIM(b.Transcript))
                               FROM ACCOUNT_DATA b
                               WHERE b.ContactId = a.ContactId
                               AND b.Intent = a.Intent
                              FOR XML PATH('')), 1, 2, '') AS "IntentTranscript"
                    FROM ACCOUNT_DATA a
                    GROUP BY a.ContactId, a.Intent
                ) c
           WHERE c.ContactId = INNER_ACCOUNT_DATA.ContactId
          FOR XML PATH('')), 1, 2, '')
FROM 
(
    SELECT a.ContactId,
        a.Intent + ' (' + CONVERT(VARCHAR,COUNT(a.Intent)) + ') : ' +
        STUFF((SELECT ' ,' + LTRIM(RTRIM(b.Transcript))
               FROM ACCOUNT_DATA b
               WHERE b.ContactId = a.ContactId
               AND b.Intent = a.Intent
              FOR XML PATH('')), 1, 2, '') AS "IntentTranscript"
    FROM ACCOUNT_DATA a
    GROUP BY a.ContactId, a.Intent
) AS INNER_ACCOUNT_DATA
ORDER BY ContactId

Вот демоверсия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...