2012-04-02 34 views
2

我一直在努力研究如何實現這一目標,但我想我只是沒有技能來知道首先要找什麼。我正在使用現有的系統,我不能改變數據庫模式,也不能決定用戶如何輸入數據。我必須與我們所擁有的一起工作。將選擇結果(一列)拆分爲多列

目前,我們的用戶正在將統計數據放入表格中的一個文本字段中。他們使用每行一個統計數據的標準格式,並使用文本限定符來「劃定」統計數據的細節。即

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

(有沒有實際數據的任何<>括號...我只是用它們來展示其中的細節去。)

在上面的例子中,這兩個統計都舉行在一個文本字段記錄中......表中有很多這樣的「統計」記錄。

編輯:我正在使用MS SQL Server 2005 我需要爲每個描述量化/值的總和創建一個報告。

我已經實現了一個分離的用戶函數,我可以在一條記錄上使用它來將每行分割成單獨的記錄......但這是我設法得到的。

我需要'從StatsTable中選擇統計信息',然後遍歷每個統計記錄,將其分成單獨的行,然後從每個分割線中提取類別,描述,數量和值,然後返回所有結果一張桌子。

+0

你說:「爲每個描述創建量化值/值的總和報告。」你能描述一下好一點嗎?你真的應該儘量避免用「通過每個統計記錄循環」等術語來思考......希望有一個直接的方法可以在沒有任何循環的情況下實現結果。但是您需要顯示一些示例數據和期望的結果。 – 2012-04-02 17:22:36

+0

您可以添加當前結果的示例(使用分割函數之後)以及數據如何結束?另外,你允許使用存儲過程嗎? – 2012-04-02 17:25:09

回答

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