有没有人知道如何处理以下查询,或者任何人都可以提供解决方案?
“印章缺陷”问题:我们有“SECTION”标签定义的路段。每个部分都经过调查,并且已经为每个部分的各个部分(小节)分配了道路缺陷。
例如,起点为“10”且终点“20”的道路缺陷“裂缝”表示从路段开始10米处开始道路裂缝,并且从路段开始处20米处完成。 / p>
在调查中,相同类型的缺陷不重叠,但不同类型的缺陷可以重叠。
这项任务的目的是“砍掉”输入数据,并将每个路段分类一系列影响该分段的缺陷。
输出列出了每个部分从开始到结尾的子部分,并列出了影响该部分的缺陷。
我们没有列出没有任何缺陷的小节。输出子部分不重叠。
在您的解决方案中,您可以根据需要创建中间局部变量或临时表。
请参阅下面的SecA示例输出
使用所有3个部分A,B和C的输出填充@OutputChoppedDefectXml表
缺陷列表的列是xml类型。
在名为<DefectCodes>
重要 - <DefectCodes>
中的缺陷列表必须采用CODE_ORDER
表格中@DefectCode
给出的顺序
如果相邻的输出子部分具有相同的结果缺陷列表,则无需合并它们。
定义部分
DECLARE @InputSection TABLE
(
SECTION nvarchar(30) NOT NULL PRIMARY KEY CLUSTERED,
SECTION_LENGTH decimal(9,2) NOT NULL
);
缺陷代码查找表
DECLARE @DefectCode TABLE
(
DEFECT_CODE nvarchar(10) NOT NULL PRIMARY KEY CLUSTERED,
CODE_ORDER int NOT NULL
);
输入调查数据。相同类型的缺陷不会重叠
DECLARE @SectionDefect TABLE
(
SECTION nvarchar(30) NOT NULL,
START_POINT decimal(9,2) NOT NULL,
END_POINT decimal(9,2) NOT NULL
,DEFECT_CODE nvarchar(10) NOT NULL
);
- 设置缺陷查找表
INSERT INTO @DefectCode (DEFECT_CODE, CODE_ORDER)
VALUES
('FRET', 1)
,('CRACK', 2)
,('RUT', 3)
,('POTHOLE', 4)
,('FAT', 5);
- 创建测试数据输入
INSERT INTO @InputSection (SECTION, SECTION_LENGTH)
VALUES
('SecA', 150.0)
,('SecB', 100.0)
,('SecC', 220.0);
INSERT INTO @SectionDefect (SECTION, START_POINT, END_POINT, DEFECT_CODE)
VALUES
('SecA', 0, 100, 'RUT')
,('SecA', 50, 140, 'FAT')
,('SecA', 10, 20, 'POTHOLE')
,('SecA', 60, 70, 'POTHOLE')
,('SecB', 0, 70, 'RUT')
,('SecB', 20, 90, 'CRACK')
,('SecB', 60, 100, 'FRET')
,('SecC', 50, 150, 'FRET')
,('SecC', 30, 200, 'RUT')
,('SecC', 190, 210, 'POTHOLE')
,('SecC', 10, 20, 'POTHOLE')
,('SecC', 40, 130, 'FAT')
,('SecC', 130, 210, 'FAT');
- SecA的切断输出示例
DECLARE @ExampleChoppedDefectXml TABLE
(
SECTION nvarchar(30)NOT NULL
,START_POINT decimal(9,2)NOT NULL
,END_POINT decimal(9,2)NOT NULL
,DEFECT_CODES_XML xml NOT NULL
);
- 你的切断输出在这里
DECLARE @OutputChoppedDefectXml TABLE
(
SECTION nvarchar(30) NOT NULL
,START_POINT decimal(9,2) NOT NULL
,END_POINT decimal(9,2) NOT NULL
,DEFECT_CODES_XML xml NOT NULL
);
- 仅限A部分的示例输出 - 注 - 其中的缺陷列表必须按照@DefectCode表中CODE_ORDER给出的顺序
INSERT INTO @ExampleChoppedDefectXml (SECTION, START_POINT, END_POINT, DEFECT_CODES_XML)
VALUES
('SecA', 0, 10, '<DefectCodes>RUT</DefectCodes>')
,('SecA', 10, 20, '<DefectCodes>RUT,POTHOLE</DefectCodes>')
,('SecA', 20, 50, '<DefectCodes>RUT</DefectCodes>')
,('SecA', 50, 60, '<DefectCodes>RUT,FAT</DefectCodes>')
,('SecA', 60, 70, '<DefectCodes>RUT,POTHOLE,FAT</DefectCodes>')
,('SecA', 70, 100, '<DefectCodes>RUT,FAT</DefectCodes>')
,('SecA', 100, 140, '<DefectCodes>FAT</DefectCodes>');
- 你的代码从这里开始,祝你好运!
- 您的代码在此结束
SELECT * FROM @InputSection;
SELECT * FROM @ExampleChoppedDefectXml ORDER BY SECTION, START_POINT
SELECT * FROM @OutputChoppedDefectXml ORDER BY SECTION, START_POINT
GO