【问题标题】:split select results (one column) into multiple columns将选择结果(一列)拆分为多列
【发布时间】:2012-04-02 17:08:53
【问题描述】:

我一直在尝试弄清楚如何完成此任务,但我认为我只是没有技能来知道首先要寻找什么。我正在使用现有系统,我无法更改数据库架构,也无法指定用户如何输入数据。我必须利用我们所拥有的。

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

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

(实际数据中没有任何括号......我只是用它们来显示细节的去向。)

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

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

我已经实现了一个拆分用户功能,我可以在一条记录上使用它来将每一行拆分为单独的记录...但这是我所能做到的。

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

【问题讨论】:

  • 您说“为每个描述的数量/值的总和创建一个报告。”你能描述得更好一点吗?你真的应该尽量避免用“循环遍历每个统计记录”这样的术语来思考......希望有一种直接的方法可以在没有任何循环的情况下实现你的结果。但是您需要展示一些示例数据和所需的结果。
  • 您能否添加一个示例来说明您当前的结果(使用 split 功能之后)以及数据应该如何结束?另外,你可以使用存储过程吗?

标签: sql sql-server-2005 loops split


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 2013-01-23
    相关资源
    最近更新 更多