1

一位朋友告诉我,他的新雇主需要一份 SSRS 报告来解析包含 n 次连续出现的列 1) 文字“日期:” 2) 可选分隔符 3) 后跟 DD-MM-YY 格式的日期 (前导零是可选的) 4) 分隔空间 5) 与日期相关联的单个“WORD”数据。这个词将没有嵌入的空格。

我将使用满足此标准的数据填充一个示例表,以便为您提供一个示例以使其清楚:

CREATE TABLE [dbo].[Sample](
    [RowNumber] [int] NOT NULL,
    [DataMess] [varchar](max) NOT NULL
) ON [PRIMARY]


INSERT [dbo].[Sample] ([RowNumber], [DataMess]) VALUES (1, N'Date:12-21-13 12/13/14/15 Date:4-2-11 39/12/134/14 Date:4-1-13 19/45/5/12')
INSERT [dbo].[Sample] ([RowNumber], [DataMess]) VALUES (2, N'Date:7-21-13 12/13/14/15 Date:8-21-12 39/12/34/14 Date:12-1-13 19/4/65/12')
INSERT [dbo].[Sample] ([RowNumber], [DataMess]) VALUES (3, N'Date:3-21-13 12/11233/14/15 Date:4-28-13 39/12/34/14 Date:9-19-13 19/45/65/12')

对于第一条记录,“12/13/14/15”被认为是与日期 12-21-13 关联的数据的“字”。

他被要求在 SSRS 中制作以下报告:

Row Number               DataMess
1                        Date: 12-21-13 12/13/14/15 
                         Date: 4-1-13 19/45/5/12 
                         Date: 4-2-11 39/12/134/14 

2                        Date:12-1-13 19/4/65/12 
                         Date:7-21-13 12/13/14/15 
                         Date:8-21-12 39/12/34/14 

3                        Date:9-19-13 19/45/65/12 
                         Date:4-28-13 39/12/34/14 
                         Date:3-21-13 12/11233/14/15  

请注意,每个源行号的日期按相关数据的降序排列。

我不知道 SSRS,但我的反应是向他建议他甚至不要尝试这项任务,而是告诉他的雇主,数据不应该真的试图用 T-SQL 进行所有那些丑陋的字符串解析。相反,这个重复的“日期:数据”应该存储在与父行记录相关联的各个子记录中。我相信代码会丑陋、低效、脆弱且难以维护。你怎么认为?

假设 management\client 总是正确的,或者承认“理想情况下”这是正确的,但是“现在”我们需要一个生成以下报告的 SQL,如何做到这一点?期望可以快速生成(例如半天)

4

2 回答 2

1

你当然是对的,它肯定不是存储数据的最佳方式。为该报告提取数据的任何方式都将比以不同方式存储时复杂得多。

但是,根据数据,实际生成报告仍然不会太难。由于表格结构,实际为报告生成数据集将是最难的部分。

因此,要生成数据集,您需要将数据拆分为每个Date/WordDataMess获取一行,并能够从该拆分数据中提取日期,以便能够根据需要按日期排序。

选择您希望如何拆分数据:

T-SQL中等效的拆分函数?有很多选项,这个链接 - Best Split Function也是如此。

这是一个SQL Fiddle,其中一个函数正在运行。

拆分数据后,使用适当的函数提取日期部分,即在冒号和单词数据之前的空格之间,然后CAST将其作为日期。

一旦你真正得到了数据集,它就是最简单的报告——只需添加一个基于 RowNumber 的行组,将拆分的 Date/Word 数据添加为一个详细信息字段,你就完成了。确保数据集按提取的日期字段排序,即使您实际上并未在报告中显示它。

作为一项临时措施,我当然希望这可以在半天左右的工作时间内完成。因此,对于这份报告来说,它并不算太糟糕,但对于其他任何事情,你可能会遇到麻烦。

对于几行,它可能会运行良好,但在任何非平凡大小的数据集上,性能都不是最佳的。

于 2013-04-27T20:24:18.210 回答
0

谢谢你。这是我为其余部分所做的,以使日期按 DESC 顺序排序。

SELECT
     RowNumber
     ,'Date: ' + ss.Item AS Data
     --,cast(substring(ss.Item, 1, charindex(' ' , ss.Item) ) AS date)
FROM
     Sample s
     CROSS apply dbo.SplitStrings_XML(s.DataMess,
                                      N'Date:') ss
WHERE
     Item IS NOT NULL
ORDER BY
     rownumber, 
     cast(substring(ss.Item, 1, charindex(' ' , ss.Item) ) AS date) desc

如果数据无法保持这种预期格式并且我们遇到无效的日期,那么整个报告就会崩溃。

于 2013-04-27T22:51:13.647 回答