我有如下图所示的事件数据:
。
我要根据以下条件编写查询:
如果在特定月份中有基于县,地点和月份的事故数据,则应删除空的事故行,如红色“ X”所示
如果没有基于县,地点和日期的事件数据,则应保留空白行,如绿色的勾所示
我不能使用函数或存储过程。
答案 0 :(得分:0)
您需要列出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 | | |
+--------+------+----------+--------+----------+----------+