将选择结果(一列)拆分为多个列

时间:2012-04-02 17:08:53

标签: sql sql-server-2005 loops split

我一直在努力研究如何实现这一目标,但我认为我只是没有技能知道首先要寻找什么。我正在使用现有系统,我无法改变数据库架构,也无法决定用户如何输入数据。我必须与我们的工作合作。

目前,我们的用户将统计数据放入表格的一个文本字段中。他们使用的是每行一个统计数据的标准格式,文本限定符用于“划分”统计信息的详细信息。即。

<Category> - D:<Description> Q:<Quanitity> V:<Value>
<Category> - D:<Description> Q:<Quanitity> V:<Value>

(实际数据中没有任何&lt;&gt;括号......我只是用它们来显示细节的位置。)

在上面的示例中,两个统计信息保存在一个文本字段记录中...表中有许多“统计信息”记录。

编辑:我正在使用MS SQL Server 2005 我需要为每个描述的quanitites / values的总和创建一个报告。

我已经实现了一个拆分用户函数,我可以在一条记录上使用它来将每一行拆分成单独的记录......但这就是我设法得到的。

我需要'从StatsTable中选择统计数据',然后遍历每个统计记录,将其拆分为单独的行,然后从每个分割行中提取类别,描述,数量和值,然后将所有结果返回到一个表

1 个答案:

答案 0 :(得分:0)

我已经设法将一个嵌套的光标拼凑起来......它看起来很有效。

declare o CURSOR FAST_FORWARD FOR
select comments from EVENT

declare @comment nvarchar(max)

OPEN o FETCH NEXT FROM o into @comment

while @@FETCH_STATUS = 0
BEGIN
Declare @item nvarchar(750)

declare @tbl Table(Category nvarchar(250), Description nvarchar(250), Quantity nvarchar(250), Value DECIMAL(10,2))

declare c CURSOR FAST_FORWARD FOR
SELECT items FROM dbo.Split(@comment, Char(10))

OPEN c FETCH NEXT FROM c into @item

WHILE @@FETCH_STATUS = 0
BEGIN
    set @item = @item + ':'
    insert into @tbl
    Values (LTRIM(RTRIM(SUBSTRING(@item, 1, CHARINDEX(' - ', @item) - 1))),
            CASE when @item like '%D:%' Then LTRIM(RTRIM(SUBSTRING(@item, CHARINDEX('D:', @item) + 2, CHARINDEX(':', @item, CHARINDEX('D:', @item)+2) - CHARINDEX('D:', @item) - 3))) else '' end,
            CASE when @item like '%Q:%' Then LTRIM(RTRIM(SUBSTRING(@item, CHARINDEX('Q:', @item) + 2, CHARINDEX(':', @item, CHARINDEX('Q:', @item)+2) - CHARINDEX('Q:', @item) - 3))) else '1' end,
            CASE when @item like '%V:%' Then CONVERT(DECIMAL(10,2),dbo.RemoveNonNumericCharacters(LTRIM(RTRIM(SUBSTRING(@item, CHARINDEX('V:', @item) + 2, CHARINDEX(':', @item, CHARINDEX('V:', @item)+2) - CHARINDEX('V:', @item) - 3))))) else 0 end)
    FETCH NEXT FROM c into @item
END
CLOSE c DEALLOCATE c
END
CLOSE o DEALLOCATE o
SELECT * FROM @tbl