删除没有事件数据的行

时间:2019-02-28 12:59:18

标签: sql-server select duplicates sql-server-2014

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

this image

我要根据以下条件编写查询:

  1. 如果在特定月份中有基于县,地点和月份的事故数据,则应删除空的事故行,如红色“ X”所示

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

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

1 个答案:

答案 0 :(得分:0)

您需要列出CountySite,“网站编号, 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 |          |          |
+--------+------+----------+--------+----------+----------+