SQL Server:如何处理这个问题 - SQL中的Chop缺陷

时间:2016-11-14 13:02:12

标签: sql sql-server

有没有人知道如何处理以下查询,或者任何人都可以提供解决方案?

“印章缺陷”问题:我们有“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

0 个答案:

没有答案