2011-08-22 2 views
0

스프레드 시트 시스템에서 참조 테이블로 사용되는 몇 개의 스프레드 시트가 있으며 SQL을 사용하고 있습니다. 스프레드 시트를 SQL에 가져 왔으며 가져온 테이블에서 일종의 EAV (Entity Attribute Value) 테이블을 작성하려고합니다. 나는 그것이 가장 효율적인 방법은 아니지만 지금은 충분하다는 것을 알고 있습니다. 참조 용 EAV 테이블을 구축하기위한 SQL 탐색 열

WHERE_COLUMN COL1 COL2  COL3 COL4 
ROW1   2.00 0.00  4.00 10.00 
ROW2   2.00 5.00  2.00 2.00 
ROW3   2.00 2.00  0.00 2.00 
ROW4   2.00 0.00  0.00 0.00 
ROW5   2.00 2.00 10.00 80.00 
ROW6   2.00 0.00  5.00 0.00 

가되고 있습니다 테이블 이후

ROW1 COL1 2.00 
ROW1 COL2 0.00 
ROW1 COL3 4.00 
ROW1 COL4 10.00 

.... 

ROW6 COL3 5.00 
ROW6 COL4 0.00 

.... 

ROW(n) COL(n) 0.00 

이 매우 크고 열 여러 변수 금액 (최대 50 일부)는 손으로 그렇게 지루한 것이 있습니다. 테이블 당 행과 열의 양은 시간이 지남에 따라 변경 될 수 있으므로 INSERT/UPDATE하기가 더 쉽습니다. 어떤 아이디어라도 환영받을 수도 있고 더 좋고 더 깨끗한 방법도 환영 할 것입니다. 감사합니다

+2

어떤 데이터베이스가 있습니까? – HLGEM

답변

0

나는 당신의 열 행 모델에 충실하면 내가 지금처럼 테이블 레이아웃을 사용하십시오 :

**table sheetvalues** 
id: integer auto_increment primary key 
sheet_id: integer foreign key to table sheet 
rownr: integer not null indexed 
colnr: integer not null indexed 
value: integer (or whatever) 

**table sheet** 
id: integer auto_increment primary key 
sheetname: varchar 
rowcount: integer 
colcount: integer 

당신은 C#을, PHP와 같은 언어의 동적 SQL 문을 구축하여 테이블을 가져올 수 있습니다, 펄, 자바 또는 뭐든간에.
델파이 의사 코드를 사용할 것입니다.

function GetConversionSQL(DBName, Sheetname, SheetDef, DataTable: string): string; 
var 
    DefQuery: TQuery; 
    Rowcount: integer; 
    ColCount: integer; 
    i: integer; 
    Select: string; 
begin 
    DefQuery:= TQuery.Create(Form1); 
    try 
    DefQuery.DatabaseName:= DBName; 
    DefQuery.SQL.Text:= 'SELECT rowcount, colcount FROM '+SheetDef+ 
         'WHERE sheetname = ' + sheetname; 
    DefQuery.Open; 
    //DefQuery will open on the first and only row 
    RowCount:= DefQuery.FieldByName('Rowcount').AsInteger; 
    ColCount:= DefQuery.FieldByName('Colcount').AsInteger; 
    finally 
    DefQuery.Free; 
    end; 

    Select:= ''; 
    if colcount > 0 then begin 
    for i:= 1 to colcount do begin 
     Select:= Select + 'SELECT where_col, col'+IntToStr(i)+' FROM '+DataTable; 
     if i < colcount then Select:= Select + ' UNION '; 
    end; 
    Select:= 'INSERT INTO sheetvalues '+ Select; 
    end; 
    Result:= Select; 
end; 

procedure ConvertATable; 
var 
    ConversionSQL: string; 
    ImportQuery: TQuery; 
begin 
    ConversionSQL:= GetConversionSQL('Mydatabase', 'sheet1', 'sheetdef' 
            , 'table_sheet1'); 
    ImportQuery:= TQuery.Create(Form1); 
    try 
    ImportQuery.DatabaseName:= 'MyDatabase'; 
    ImportQuery.SQL.Text:= ConversionSQL; 
    ImportQuery.ExecSQL; 
    finally 
    ImportQuery.Free; 
    end; 
end; 
관련 문제