2017-01-05 1 views
3

Пожалуйста, смотрите на этот вопрос, чтобы получить больше контекста: question 1 Я создал список информации с помощью функции поворота, используя следующий код нижеSQL функция Pivot, чтобы получить верхнее поле примечания

WITH List AS 
    (
     SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime UNION ALL 
     SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime UNION ALL 
     SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime UNION ALL 
     SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime UNION ALL 
     SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime UNION ALL 
     SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime UNION ALL 
     SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime UNION ALL 
     SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime UNION ALL 
     SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime UNION ALL 
     SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime UNION ALL 
     SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime 
    ) 


    SELECT Company, Call, Meeting, Email 
    FROM 
    (
     SELECT StartTime, ContactType, Company 
     FROM List 
    ) L 
    PIVOT 
    (
     MAX(StartTime) 
     FOR ContactType IN (Call, Meeting, Email) 
    ) CT 

Это помогает произвести результат таблицы так как:

+---------+------------+------------+------------+ 
| Company | Call | Meeting | Email | 
+---------+------------+------------+------------+ 
| x  | 02/01/2016 | 02/01/2016 | 03/01/2016 | 
| y  | 02/02/2016 | 01/01/2016 | 01/02/2016 | 
| z  | 24/01/2016 | 10/01/2016 | Null  | 
+---------+------------+------------+------------+ 

Я хотел бы добавить это, добавив дополнительную колонку в свой первоначальный запрос. Я хотел бы иметь записи в запросе, как так:

выход
WITH List AS 
    (
     SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL 
     SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL 
     SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL 
     SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL 
     SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL 
     SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL 
     SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL 
     SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL 
     SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL 
     SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL 
     SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note 
    ) 

В таблице я хотел бы произвести это:

+---------+------------+------------+------------+------------+ 
| Company | Call | Meeting | Email | Note | 
+---------+------------+------------+------------+------------+ 
| x  | 02/01/2016 | 02/01/2016 | 03/01/2016 | blablabla4 | 
| y  | 02/02/2016 | 01/01/2016 | 01/02/2016 | blablabla7 | 
| z  | 24/01/2016 | 10/01/2016 | Null  | blablabla9 | 
+---------+------------+------------+------------+------------+ 

Теперь хитрый бит. Я хотел бы, чтобы эта заметка была выбрана как последняя нота, основанная на форме контакта. В верхней строке примечание: blablabla4 выбирается, потому что последний контакт по электронной почте '03/01/2016 ', поэтому он выбирает эту заметку.

Кто-нибудь есть идеи, как я мог бы достичь этого, не используя sub-запрос моих собственных данных.

ответ

3

Вы можете использовать ROW_NUMBER(), чтобы получить последнюю ноту

WITH List AS 
    (
     SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL 
     SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL 
     SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL 
     SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL 
     SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL 
     SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL 
     SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL 
     SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL 
     SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL 
     SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL 
     SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note 
    ) 
Select Company 
     ,Call = max(case when ContactType='Call' then StartTime end) 
     ,Meeting = max(case when ContactType='Meeting' then StartTime end) 
     ,Email = max(case when ContactType='Email' then StartTime end) 
     ,Note = max(case when ContactType<>'Email' and RN=1 then Note end) 
From (
     Select * 
       ,RN = Row_Number() over (Partition By Company,case when ContactType <>'EMail' then 1 else 0 end Order By StartTime Desc) 
     from List 
    ) A 
Group BY Company 

Возвращает

Company Call  Meeting  Email  Note 
x  02/01/2016 02/01/2016 03/01/2016 blablabla3 
y  02/02/2016 01/01/2016 01/02/2016 blablabla7 
z  24/01/2016 10/01/2016 NULL  blablabla9 
+0

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

+0

@RichardThompson Один момент –

+1

@RichardThompson См. Обновленный ответ –

3

Использование Conditional Aggregate вместо поворота

WITH List AS 
    (
     SELECT 'x' AS Company, 'Call' AS ContactType, '01/01/2016' AS StartTime, 'blablabla1' as Note UNION ALL 
     SELECT 'x' AS Company, 'Call' AS ContactType, '02/01/2016' AS StartTime, 'blablabla2' as Note UNION ALL 
     SELECT 'x' AS Company, 'Meeting' AS ContactType, '02/01/2016' AS StartTime, 'blablabla3' as Note UNION ALL 
     SELECT 'x' AS Company, 'Email' AS ContactType, '03/01/2016' AS StartTime, 'blablabla4' as Note UNION ALL 
     SELECT 'y' AS Company, 'Meeting' AS ContactType, '01/01/2016' AS StartTime, 'blablabla5' as Note UNION ALL 
     SELECT 'y' AS Company, 'Email' AS ContactType, '01/02/2016' AS StartTime, 'blablabla6' as Note UNION ALL 
     SELECT 'y' AS Company, 'Call' AS ContactType, '02/02/2016' AS StartTime, 'blablabla7' as Note UNION ALL 
     SELECT 'z' AS Company, 'Call' AS ContactType, '09/01/2016' AS StartTime, 'blablabla8' as Note UNION ALL 
     SELECT 'z' AS Company, 'Call' AS ContactType, '24/01/2016' AS StartTime, 'blablabla9' as Note UNION ALL 
     SELECT 'z' AS Company, 'Meeting' AS ContactType, '10/01/2016' AS StartTime, 'blablabla10' as Note UNION ALL 
     SELECT 'z' AS Company, 'Meeting' AS ContactType, '06/01/2016' AS StartTime, 'blablabla11' as Note 
    ) 
SELECT Company, 
     call = Max(CASE WHEN ContactType = 'call' THEN StartTime END), 
     Meeting = Max(CASE WHEN ContactType = 'Meeting' THEN StartTime END), 
     Email = Max(CASE WHEN ContactType = 'Email' THEN StartTime END), 
     Note 
FROM (SELECT Company, 
       ContactType, 
       StartTime, 
       First_value(Note)OVER(partition BY Company ORDER BY StartTime DESC) AS Note 
     FROM list) a 
GROUP BY Company,note 
+0

'макс (примечание)'? .. –

+0

@vkp - из-за выборочных данных я просто решил пойти с 'Max (Note)' Я думаю, что ему просто нужно максимальное количество столбцов –

+0

да .. это примечание, соответствующее максимальному времени начала работы компании. –

Смежные вопросы