2012-04-02 4 views
2

나는 이것을 수행하는 방법을 연구했지만, 처음부터 무엇을 찾아야 할지를 알지 못한다고 생각합니다. 기존 시스템으로 작업 중이며 데이터베이스 스키마를 변경할 수 없으며 사용자가 데이터를 입력하는 방법을 지정할 수도 없습니다. 우리가 가진 것과 함께 일해야합니다.여러 열로 결과 (한 열)를 선택하십시오.

현재 Google 사용자는 통계 데이터를 표의 한 텍스트 입력란에 넣습니다. 그들은 통계의 세부 사항을 '구분'하기 위해 텍스트 한정자와 함께 한 줄에 하나의 stat 표준 형식을 사용하고 있습니다. 즉

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

(실제 데이터의 모든 <> 괄호가 ... 난 그냥 세부 사항이 이동하는 위치를 보여주기 위해이 사용되었다되지 않습니다.) 위의 예에서

, 두 통계가 개최된다 하나의 텍스트 필드 레코드에 ... 이러한 테이블의 많은 '통계'레코드가 있습니다.

편집 : MS SQL Server 2005를 사용 중입니다. 설명 당 quanitites/values의 합계에 대한 보고서를 만들어야합니다.

하나의 레코드에서 각 레코드를 개별 레코드로 나눌 수있는 분할 사용자 기능을 구현했습니다 ...하지만 지금까지 내가 관리해온 것입니다.

'통계를 StatsTable에서 선택'하고 각 통계 레코드를 반복하여 개별 라인으로 분할 한 다음 각 분할 선에서 카테고리, 설명, 수량 및 값을 추출한 다음 하나의 테이블.

+0

"설명에 대한 quanitites/값의 합계에 대한 보고서 작성"이라고 말합니다. 좀 더 잘 설명해 주시겠습니까? 당신은 정말로 "각 통계 기록을 통한 반복"과 같은 용어로 생각하지 않으려 고 노력해야합니다 ... 잘하면 루핑없이 결과를 달성하는 간단한 방법이 있습니다. 그러나 몇 가지 샘플 데이터와 원하는 결과를 보여줘야합니다. –

+0

(split 함수 사용 후) 현재 결과의 예와 데이터가 어떻게 끝나야할까요? 또한 저장 프로 시저를 사용할 수 있습니까? –

답변

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 
관련 문제