删除没有事件数据的行

Remove the rows that does not have incident data

我有如图所示的事件数据:

.

我想根据这些条件编写查询:

  1. 如果特定月份有基于县、站点和月份的事件数据,则应删除空事件行,如红色所示 "X"

  2. 如果没有基于县、地点和日期的事件数据,则应保留空行,如绿色勾号所示

我不会使用函数或存储过程。

您需要 CountySite、“站点编号, and日期(month), and then you want事件and优先级”的所有唯一组合的列表,如果它们存在。

这是一道两步题。首先,生成唯一值列表。那是带有 GROUP BY 的内部子查询。

然后执行 LEFT JOIN 回到基础 table,但仅在 Incident 存在的地方。这是 ON 子句中的最后一个 JOIN 条件。

结果集将仅显示 Incident 存在的数据(删除您想要删除的空记录),但将为每个没有任何事件的唯一组合创建一个空记录。 COALESCE 语句只是 window 使结果漂亮的修饰。

数据设置:

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