admin

将选择结果(一列)分成多列

sql

我一直在尝试解决该问题的方法,但是我想我只是不具备一开始就知道要寻找什么的技能。我正在使用现有系统,因此无法更改数据库架构,也不能指示用户如何输入数据。我必须与我们所拥有的一起工作。

当前,我们的用户正在将统计数据放入表格的一个文本字段中。他们使用每行一个统计信息的标准格式,并使用文本限定符来“界定”统计信息的详细信息。IE

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

(实际数据中没有任何<>括号…我只是用它们来显示细节在哪里。)

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

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

我实现了一个拆分用户功能,可以在一条记录上使用该功能将每一行拆分为单独的记录…但是据我所知。

我需要“从StatsTable中选择Stats”,然后遍历每个stats记录,将其拆分成单独的行,然后从每个拆分的行中提取类别,描述,数量和值,然后将所有结果返回到一个表中。


阅读 248

收藏
2021-06-07

共1个答案

admin

我已经设法将一个嵌套的游标拼凑在一起了……看起来很有效。

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
2021-06-07