Удалить строки, в которых нет данных об инцидентах - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть данные об инциденте, как показано на этом изображении:

this image.

Я хочу написать запрос на основе следующих условий:

  1. Если для определенного месяца имеются данные об инциденте, основанные на округе, месте и месяце, то пустая строка инцидента должна быть удалена, как показано красным цветом «X»

  2. Если естьнет данных об инцидентах, основанных на округе, месте и дате, тогда должна быть сохранена пустая строка, как показано зеленой галочкой

Я не могу использовать функции или хранимые процедуры.

1 Ответ

0 голосов
/ 01 марта 2019

Вы хотите получить список всех уникальных комбинаций County, Site, 'Номер сайта , and Дата (month), and then you want Инцидент and Приоритет`, если они существуют.

Это двашаг вопрос.Сначала создайте список уникальных значений.Это внутренний подзапрос с GROUP BY.

Затем выполните LEFT JOIN назад к базовой таблице, но только там, где существует Incident.Это последний из критериев JOIN в предложении ON.

В наборе результатов будут отображаться только данные Incident там, где они существуют (избавление от пустых записей, которые вы хотите удалить), но создастпустая запись для каждой уникальной комбинации, в которой нет инцидентов.Операторы COALESCE - это просто оформление витрин, чтобы сделать результаты красивыми.

Настройка данных:

DECLARE @t TABLE
  (
    County   VARCHAR(10) NOT NULL
   ,Site     VARCHAR(10) NOT NULL
   ,SiteName VARCHAR(10) NOT NULL
   ,Date     VARCHAR(6)  NOT NULL
   ,Incident VARCHAR(5)  NULL
   ,Priority CHAR(2)     NULL
  );
INSERT @t
  (
    County
   ,Site
   ,SiteName
   ,Date
   ,Incident
   ,Priority
  )
VALUES
  ('C1', 'S1', 'Sn1', 'Jan-19', 'INC3', '')
 ,('C1', 'S1', 'Sn1', 'Jan-19', '', '')
 ,('C1', 'S1', 'Sn1', 'Feb-19', 'INC2', '')
 ,('C1', 'S1', 'Sn1', 'Feb-19', 'INC1', '')
 ,('C1', 'S1', 'Sn1', 'Feb-19', '', '')
 ,('C1', 'S2', 'Sn2', 'Jan-19', '', '')
 ,('C1', 'S2', 'Sn2', 'Feb-19', '', '');

Запрос:

SELECT
  list.County
 ,list.Site
 ,list.SiteName
 ,list.Date
 ,COALESCE(t1.Incident, '') AS Incident
 ,COALESCE(t1.Priority, '') AS Priority
FROM
  (
    SELECT
      t.County
     ,t.Site
     ,t.SiteName
     ,t.Date
    FROM
      @t AS t
    GROUP BY
      t.County
     ,t.Site
     ,t.SiteName
     ,t.Date
  ) AS list
LEFT JOIN
  @t AS t1
    ON
    t1.County = list.County
      AND t1.Site = list.Site
      AND t1.SiteName = list.SiteName
      AND t1.Date = list.Date
      AND t1.Incident <> '';

Результаты:

+--------+------+----------+--------+----------+----------+
| County | Site | SiteName |  Date  | Incident | Priority |
+--------+------+----------+--------+----------+----------+
| C1     | S1   | Sn1      | Feb-19 | INC2     |          |
| C1     | S1   | Sn1      | Feb-19 | INC1     |          |
| C1     | S1   | Sn1      | Jan-19 | INC3     |          |
| C1     | S2   | Sn2      | Feb-19 |          |          |
| C1     | S2   | Sn2      | Jan-19 |          |          |
+--------+------+----------+--------+----------+----------+
...