Объедините два набора данных, где данные могут не совпадать - PullRequest
0 голосов
/ 01 октября 2018

У меня есть два набора данных, которые я хотел бы объединить и возвратить их одновременно, однако столбец, к которому мне нужно будет присоединиться, может иметь значение в наборе A, а не в наборе B, и наоборот, поэтому ВЛЕВО/ ПРАВАЯ СОЕДИНЕНИЯ не идеальны.

Задать A

Запрос -

SELECT o.organisation_id, 
       Count(call_opened)           'opened calls',
       Format(call_opened, 'MMM-yy')'month name', 
       call_severity 
FROM   call c 
       JOIN users u 
         ON u.user_id = c.user_id 
       JOIN organisation o 
         ON o.organisation_id = u.organisation_id
WHERE  Call_Type = 'FT'
GROUP  BY o.organisation_id, 
          Format(call_opened, 'MMM-yy'), 
          call_severity

Возвраты -

organisation_id opened calls    month name  call_severity
BES             1               Apr-12      3
BES             1               Dec-13      3
BES             1               Jun-12      3
BES             1               Mar-12      3
BES             2               Nov-11      3
BES             1               Oct-11      3

Набор B

Запрос -

SELECT o.organisation_id, 
       Count(call_closed)           'closed calls', 
       Format(call_closed, 'MMM-yy')'month name', 
       call_severity 
FROM   call c 
       JOIN users u 
         ON u.user_id = c.user_id 
       JOIN organisation o 
         ON o.organisation_id = u.organisation_id
WHERE  Call_Type = 'FT'
GROUP  BY o.organisation_id, 
          Format(call_closed, 'MMM-yy'), 
          call_severity

Возвраты -

organisation_id closed calls    month name  call_severity
BES             2               Aug-13      3
BES             1               Dec-11      3
BES             1               Dec-13      3
BES             1               Mar-12      3
BES             1               Nov-11      3
BES             1               Sep-12      3

Пока

Запрос-

SELECT opened.organisation_id, 
       Isnull(opened.[opened calls],0) 'opened calls',  
       Isnull(closed.[closed calls],0) 'closed calls',  
       opened.[month name], 
       opened.call_severity 
FROM   (SELECT o.organisation_id, 
               Count(call_opened)           'opened calls', 
               Format(call_opened, 'MMM-yy')'month name', 
               call_severity 
        FROM   call c 
               JOIN users u 
                 ON u.user_id = c.user_id 
               JOIN organisation o 
                 ON o.organisation_id = u.organisation_id
        WHERE  Call_Type = 'FT'
        GROUP  BY o.organisation_id, 
                  Format(call_opened, 'MMM-yy'), 
                  call_severity) opened 
       LEFT JOIN (SELECT o.organisation_id, 
                         Count(call_closed)           'closed calls', 
                         Format(call_closed, 'MMM-yy')'month name', 
                         call_severity 
                  FROM   call c 
                         JOIN users u 
                           ON u.user_id = c.user_id 
                         JOIN organisation o 
                           ON o.organisation_id = u.organisation_id
                  WHERE  Call_Type = 'FT'
                  GROUP  BY o.organisation_id, 
                            Format(call_closed, 'MMM-yy'), 
                            call_severity) closed 
         ON opened.organisation_id = closed.organisation_id 
            AND opened.[month name] = closed.[month name] 
            AND opened.call_severity = closed.call_severity
WHERE opened.Call_Severity <> 5
ORDER  BY opened.organisation_id ASC

Возвращает -

organisation_id opened calls    closed calls    month name  call_severity
BES             1               0               Apr-12      3
BES             1               1               Dec-13      3
BES             1               0               Jun-12      3
BES             1               1               Mar-12      3
BES             2               1               Nov-11      3
BES             1               0               Oct-11      3

Как вы можете видеть, это не возвращает нужные мне данные из-за набора B, содержащего данные за месяцы, которых нет в наборе A.

В идеале я хотел бы, чтобы данные возвращались следующим образом -

organisation_id opened calls    closed calls    month name  call_severity
BES             1               0               Apr-12      3
BES             1               1               Dec-13      3
BES             1               0               Jun-12      3
BES             1               1               Mar-12      3
BES             2               1               Nov-11      3
BES             1               0               Oct-11      3
BES             0               2               Aug-13      3
BES             0               1               Dec-11      3
BES             0               1               Sep-12      3

Я думал о создании исходной временной таблицы и вставке значений месяца и объединении наборов результатов для этого, но этобыть слишком хакерским и беспорядочным из-за данных, относящихся к 2002 году, это то, что мне нужно, или мне нужно переделать решение?

Я худk это все данные, необходимые из таблицы вызовов -

Call_ID     Call_Opened                Call_Closed              Call_Severity   User_id
28000001    2011-10-19 13:13:48.000    2011-11-09 11:47:03.000  3               825
28000002    2011-11-07 10:55:24.000    2012-03-05 08:27:54.000  3               825
28000003    2011-11-21 09:11:49.000    2011-12-19 08:41:36.000  3               825
28000006    2012-03-30 15:11:23.000    2013-08-29 15:51:39.000  3               825
28000007    2012-04-02 11:50:22.000    2013-08-29 15:52:11.000  3               825
28000008    2012-06-25 08:12:39.000    2012-09-28 16:32:08.000  3               825
28000012    2013-12-17 07:41:26.000    2013-12-17 08:58:35.000  3               825

Ответы [ 4 ]

0 голосов
/ 01 октября 2018
;WITH opened AS
(
    SELECT o.organisation_id, 
           Count(call_opened)           AS call_opened,
           Format(call_opened, 'MMM-yy') AS month_name, 
           call_severity 
    FROM   call c 
           JOIN users u 
             ON u.user_id = c.user_id 
           JOIN organisation o 
             ON o.organisation_id = u.organisation_id
    WHERE  Call_Type = 'FT'
    GROUP  BY o.organisation_id, 
              Format(call_opened, 'MMM-yy'), 
              call_severity
),
closed AS
 (
    SELECT o.organisation_id, 
           Count(call_closed)           AS call_closed, 
           Format(call_closed, 'MMM-yy') AS month_name, 
           call_severity 
    FROM   call c 
           JOIN users u 
             ON u.user_id = c.user_id 
           JOIN organisation o 
             ON o.organisation_id = u.organisation_id
    WHERE  Call_Type = 'FT'
    GROUP  BY o.organisation_id, 
              Format(call_closed, 'MMM-yy'), 
              call_severity
)
 SELECT COALESCE(opened.organisation_id, closed.organisation_id) AS organisation_id, 
 COALESCE(opened.call_opened, 0) AS call_opened, COALESCE(closed.call_closed, 0) AS call_closed, 
 COALESCE(opened.month_name, closed.month_name) AS month_name, 
 COALESCE(opened.call_severity, closed.call_severity) AS call_severity
 FROM opened 
 FULL OUTER JOIN closed 
 ON opened.month_name = closed.month_name;
0 голосов
/ 01 октября 2018

Вы должны использовать UNION ALL для открытого / закрытого вызова, а затем group в верхнем запросе.см. макет ниже.Дайте мне знать, если у вас есть какие-либо проблемы.

SELECT organisation_id, 
       Isnull(SUM([opened calls]),0) 'opened calls',  
       Isnull(SUM([closed calls]),0) 'closed calls',  
       [month name], 
       call_severity 
FROM   (
---Set A 
SELECT o.organisation_id, 
       Count(call_opened)           'opened calls',
       0 'closed calls',
       Format(call_opened, 'MMM-yy')'month name', 
       call_severity 
FROM   call c 
       JOIN users u 
         ON u.user_id = c.user_id 
       JOIN organisation o 
         ON o.organisation_id = u.organisation_id
WHERE  Call_Type = 'FT'
GROUP  BY o.organisation_id, 
          Format(call_opened, 'MMM-yy'), 
          call_severity


UNION ALL   ---Set B

SELECT o.organisation_id, 
       0  'opened calls',
       Count(call_closed)           'closed calls', 
       Format(call_closed, 'MMM-yy')'month name', 
       call_severity 
FROM   call c 
       JOIN users u 
         ON u.user_id = c.user_id 
       JOIN organisation o 
         ON o.organisation_id = u.organisation_id
WHERE  Call_Type = 'FT'
GROUP  BY o.organisation_id, 
          Format(call_closed, 'MMM-yy'), 
          call_severity
)S

GROUP BY
    organisation_id,
    [month name],
    call_severity
0 голосов
/ 01 октября 2018

Это хорошее место для использования cross apply:

SELECT o.organisation_id, 
       SUM(v.is_open) as opened_calls,
       SUM(v.is_close) as closed_calls,
       Format(call_time, 'MMM-yy') as month_name, 
       call_severity 
FROM call c JOIN
     users u 
     ON u.user_id = c.user_id JOIN
     organisation o 
     ON o.organisation_id = u.organisation_id CROSS APPLY
     (VALUES (call_opened, 1, 0 ), 
             (call_closed, 0, 1)
     ) as v(call_time, is_open, is_close)
WHERE Call_Type = 'FT'
GROUP BY o.organisation_id, 
         Format(call_time, 'MMM-yy'), 
         call_severity
0 голосов
/ 01 октября 2018

Вы должны использовать союз

select organisation_id
, sum(opened_calls) opened_calls
, sum(closed_calls) closed_calls
, month_name 
, call_severity
from (
SELECT o.organisation_id, 
   Count(call_opened)           opened_calls,
   0                            closed_calls,
   Format(call_opened, 'MMM-yy') month_name, 
   call_severity 
FROM   call c 
   JOIN users u 
     ON u.user_id = c.user_id 
   JOIN organisation o 
     ON o.organisation_id = u.organisation_id
WHERE  Call_Type = 'FT'
GROUP  BY o.organisation_id, 
      Format(call_opened, 'MMM-yy'), 
      call_severity
union 
SELECT o.organisation_id, 
   0                            opened_calls
   Count(call_closed)           closed_calls, 
   Format(call_closed, 'MMM-yy') month_name, 
   call_severity 
FROM   call c 
   JOIN users u 
     ON u.user_id = c.user_id 
   JOIN organisation o 
     ON o.organisation_id = u.organisation_id
WHERE  Call_Type = 'FT'
GROUP  BY o.organisation_id, 
      Format(call_closed, 'MMM-yy'), 
      call_severity
)tt
group by organisation_id, month_name, call_severity 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...