разделить выбранные результаты (один столбец) на несколько столбцов - PullRequest
2 голосов
/ 02 апреля 2012

Я пытался понять, как это сделать, но я думаю, что у меня просто нет навыков, чтобы знать, что искать в первую очередь.Я работаю с существующей системой и не могу изменить схему базы данных, а также не могу диктовать, как пользователи вводят данные.Я должен работать с тем, что у нас есть.

В настоящее время наш пользователь помещает данные статистики в одно текстовое поле в таблице.Они используют стандартный формат по одной статистике на строку с квалификаторами текста для «разграничения» деталей статистики.то есть

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

(в реальных данных нет скобок <> ... я просто использовал их, чтобы показать, куда идут детали.)

В приведенном выше примередве статистики хранятся в одной записи текстового поля ... и в таблице много таких записей статистики.

Редактировать: я использую MS SQL Server 2005 Мне нужно создать отчет для суммкванититы / значения в описании.

Я реализовал функцию разделения пользователя, которую я могу использовать в одной записи, чтобы разбить каждую строку на отдельные записи ... но это настолько, насколько мне удалось получить.

Мне нужно «Выбрать статистику из таблицы StatsTable», затем пройтись по каждой записи статистики, разделить ее на отдельные строки, затем извлечь категорию, описание, количество и значение из каждой строки разделения, а затем вернуть все результатыв одной таблице.

1 Ответ

0 голосов
/ 03 апреля 2012

Мне удалось соединить вложенный курсор ... Похоже, он работает.

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
...