一位朋友告诉我,他的新雇主需要一份SSRS报告来解析一个包含连续n次出现的列 1)字面意思“日期:” 2)可选的分隔符 3)后面是DD-MM-YY格式的日期(前导零是可选的) 4)分隔符空间 5)与日期相关联的单个“WORD”数据。这个词没有嵌入空格。
我将使用符合此标准的数据填充Sample表,为您提供一个清晰的示例:
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
请注意,每个源行号的日期都按降序arder进行排序,并带有相关的数据。
我不知道SSRS,但我的反应是向他推荐他甚至没有尝试任务,而是告诉他的雇主数据不应该真的试图用T-解析所有那些丑陋的字符串。 SQL。相反,重复的“Date:DATA”应存储在与父行记录关联的各个子记录中。我相信代码会丑陋,低效,脆弱且难以维护。你有什么想法?
假设management \ client始终是正确的或者理所当然地认为“理想”这是正确的,但“现在”我们需要一个生成以下报告的SQL,如何做到这一点?期望这可以快速生成(例如半天)
答案 0 :(得分:1)
您当然是正确的,它肯定远离存储数据的最佳方式。提取此报告的数据的任何方式都会比以不同方式存储的方式复杂得多。
但是,根据数据,实际生成报告仍然不会太难。由于表结构实际生成报告的数据集将是最难的部分。
因此,要生成数据集,您需要在DataMess
中拆分数据,以便每个日期/字获得一行,并且能够从该拆分数据中提取日期为能够按要求按日期订购。
选择您希望如何拆分数据:
Split function equivalent in T-SQL?有很多选项,就像这个链接一样 - Best Split Function。
这里有一个SQL Fiddle,其中一个功能正在运行。
分割完数据后,使用适当的函数提取日期部分,即冒号和单词数据之前的空格,然后CAST
将其作为日期。
一旦您实际获得了数据集,它就是最简单的报告 - 只需添加基于RowNumber的行组,将拆分的日期/单词数据添加为详细信息字段即可。重做。确保数据集按提取的日期字段排序,即使您实际上没有在报告中显示该数据集。
作为一项临时措施,我当然希望这可以在半天的工作中实现。所以对于这份报告来说,这不是太糟糕,但对于其他任何事情,你可能都会遇到麻烦。
对于几行,它可能会正常运行,但在任何非平凡大小的数据集上,性能都不是最理想的。
答案 1 :(得分: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
如果数据无法达到预期的格式且我们遇到的日期无效,那么整个报告就会爆炸。