2017-01-04 1 views
1

я в настоящее время есть таблица SQL, который похож на этотSQL организовать таблицу в обобщенной точки зрения

+---------+--------------+------------+ 
| Company | Contact Type | Start Time | 
+---------+--------------+------------+ 
| x  | Call   | 01/01/2016 | 
| x  | Call   | 02/01/2016 | 
| x  | Meeting  | 02/01/2016 | 
| x  | Email  | 03/01/2016 | 
| y  | Meeting  | 01/01/2016 | 
| y  | Email  | 01/02/2016 | 
| y  | Call   | 02/02/2016 | 
| z  | Call   | 09/01/2016 | 
| z  | Call   | 24/01/2016 | 
| z  | Meeting  | 10/01/2016 | 
| z  | Meeting  | 06/01/2016 | 
+---------+--------------+------------+ 

То, что я хотел бы произвести это таблица, которая показывает самый последний тип контакта в следующем формате:

+---------+------------+------------+------------+ 
| 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  | 
+---------+------------+------------+------------+ 

Теперь я мог бы сделать так, чтобы он выглядел как это в SSRS и преобразовал набор данных в отчет матрицы матриц, но я хотел бы создать это в SQL. Мне также удалось создать это, используя множество подзапросов, но это не похоже на эффективный способ сделать это, и настоящая таблица имеет миллионы строк и больше типов контактов, чем вызов, встреча и электронная почта. Итак, вопрос в том, что является наиболее эффективным способом создания второй таблицы. Ради аргумента позволяет сказать, чтобы извлечь Таблица 1 SQL кода является:

SELECT Company, [Contact Type], [Start Time] From Db.dbo.History 
+0

FYI: все даты представлены в формате dd/mm/yyyy –

+0

Столбец Start tim тип данных e? – jarlh

ответ

2

Вы также можете сделать так: (Б сводным)

-- Your Sample 
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 

My result

+0

Это сработало для меня. Это означало отсутствие подзапросов и улучшало скорость. Отлично! –

1

Делают GROUP BY. Используйте case выражения, чтобы сделать условную агрегацию:

SELECT Company, 
     max(case when [Contact Type] = 'Call' then [Start Time] end) [Call], 
     max(case when [Contact Type] = 'Meeting' then [Start Time] end) [Meeting], 
     max(case when [Contact Type] = 'Email' then [Start Time] end) [Email] 
From Db.dbo.History 
group by Company 
0

Вы можете использовать СЛУЧАЙ здесь:

SELECT Company 
    ,CASE [Contact Type] WHEN 'Call' THEN MAX([Start Time]) END AS [Call] 
    ,CASE [Contact Type] WHEN 'Meeting' THEN MAX([Start Time]) END AS [Meeting] 
    ,CASE [Contact Type] WHEN 'Email' THEN MAX([Start Time]) END AS [Email] 
From Db.dbo.History 
GROUP BY Company 
+0

Могу ли я узнать причину, по которой кто-то проголосовал за этот ответ? – balaji

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