2012-09-25 72 views
1

我正在處理未歸一化的數據庫,因爲我沒有權限,所以無法歸一化。問題是從一個表插入到另一個表

我有兩個表

  • Gl_Account
  • 試算表

表的結構就像

Gl_Account(空表或與一些舊數據)

loc | gl_acct | HMISTOTAL 
------------------------------- 
    |   | 
------------------------------- 

試算表

loc | g1101 | g1102 | g1103 
---------------------------------------- 
1400 |  20  | 30  | 0 
---------------------------------------- 
1500 |  10  | 0  | 40 
---------------------------------------- 

現在我想做的是

獲取該記錄不在Gl_Account表從試算表與各GL_acct編號分別下的金額gXXXX (在試算表中)不爲零

讓我來舉個例子來解釋一下。保持上表記我要填寫的表格GL_Account作爲

GL_Account

loc  | gl_acct  | HMISTOTAL 
    --------------------------------------- 
     1400 |  1101  | 20 
    --------------------------------------- 
     1400 |  1102  | 30 
    --------------------------------------- 
     1500 |  1101  | 10 
    --------------------------------------- 
     1500 |  1103  | 40 
    --------------------------------------- 

我已經嘗試此查詢,但它僅是進入gl_accountt表捕獲的第一條記錄。我暫時忽略了部分金額......但它是必需的。

insert into Gl_Account (loc,gl_acct,HMISTOTAL) 
    select * from (
       select a.loc, 
       CASE 
       WHEN a.G1101 <> 0 THEN '1101' 
       WHEN a.G1102 <> 0 THEN '1102' 
       WHEN a.G1104 <> 0 THEN '1104' 
       WHEN a.G1151 <> 0 THEN '1151' 
       END AS gl_Acct 
       '0' as HMISTOTAL 
        FROM trialBalance a where NOT EXISTS 
         (SELECT 1 from GL_Account b WHERE b.loc = a.loc)) ab 

在此先感謝。

回答

1

試試這個。

INSERT INTO Gl_Account (loc,gl_acct,HMISTOTAL) 
    SELECT * FROM (
       SELECT trialBalance .loc, 
       CASE 
       WHEN a.G1101 <> 0 THEN '1101' 
       WHEN a.G1102 <> 0 THEN '1102' 
       WHEN a.G1104 <> 0 THEN '1104' 
       WHEN a.G1151 <> 0 THEN '1151' 
       END AS gl_Acct 
       '0' AS HMISTOTAL 
        FROM 
        trialBalance LEFT JOIN GL_Account 
        ON trialBalance.loc = GL_Account.loc 
        WHERE 
        GL_Account.loc IS NULL 
       ) 
+0

怎麼可能有我錯過了這樣一個簡單的方法..感謝 –

1

這得到您所指定的結果:

SELECT loc, 
     gl_acct, 
     CASE gl_acct 
      WHEN '1101' THEN g1101 
      WHEN '1102' THEN g1102 
      WHEN '1103' THEN g1103 
     END AS HMISTOTAL 
FROM trialBalance a 
JOIN (
     VALUES ('1101'), 
       ('1102'), 
       ('1103') 
     ) c(gl_acct) ON 
     (a.g1101 <> 0 AND gl_acct = '1101') OR 
     (a.g1102 <> 0 AND gl_acct = '1102') OR 
     (a.g1103 <> 0 AND gl_acct = '1103') 
WHERE NOT EXISTS 
(
    SELECT 1 
    FROM GL_Account x 
    WHERE x.loc = a.loc 
) 

我用VALUES行構造函數來創建一個包含值加入與臨時表。

+0

一個完美的解決方案..感謝 –

+0

不客氣,我很高興我可以提供幫助。 –

5

如果您在TrialBalance中的記錄數量有限且記錄數量不超過100萬條,最簡單的方法就是像下面這樣使用聯合,但是您也可以將它寫成循環,我不知道哪個會更有效率

Select loc,HMISTOTAL,gl_acct from(
SELECT [Trial Balance].loc, [Trial Balance].g1101 AS HMISTOTAL, '1101' AS gl_acct 
FROM   [Trial Balance] LEFT OUTER JOIN 
         [Gl_Account] ON [Trial Balance].g1101 = [Gl_Account].gl_acct AND [Trial Balance].loc = [Gl_Account].loc 

Union 
         SELECT [Trial Balance].loc, [Trial Balance].g1102 AS HMISTOTAL, '1102' AS gl_acct 
FROM   [Trial Balance] LEFT OUTER JOIN 
         [Gl_Account] ON [Trial Balance].g1101 = [Gl_Account].gl_acct AND [Trial Balance].loc = [Gl_Account].loc 

Union 
         SELECT [Trial Balance].loc, [Trial Balance].g1103 AS HMISTOTAL, '1103' AS gl_acct 
FROM   [Trial Balance] LEFT OUTER JOIN 
         [Gl_Account] ON [Trial Balance].g1101 = [Gl_Account].gl_acct AND [Trial Balance].loc = [Gl_Account].loc) x 

where HMISTOTAL >0 
Order By loc,HMISTOTAL 
+0

我正在考慮一個循環,但我不知道該怎麼做..光標也許..不錯的方法。 –

相關問題