2012-02-22 127 views
1

我正在使用SQL Server 2000.有一个名为trialbalance_diff的表。结构如下所示。带有IF ELSE的SQL脚本无法正常工作

accno  des     month diff 

1010011001 Cash in Hand   5  -732230.0 
1030033001 Seylan Bank   4  309042.0 
1050011001 Lease Debtors   2  9899.0 
1050011002 Lease VAT Suspense 5  2240.0 

我需要将这些数据重新写入另一个表temp_TB_Diff。应根据当月插入字段Diff。与此类似,

acc_code Acc_desc    Jan   Feb  Mar  Apr  May 

1010011001 Cash in Hand            -732230.0 
1030033001 Seylan Bank         309042.0 
1050011001 Lease Debtors    9899.0 
1050011002 Lease VAT Suspense           2240.0 

我写这个SQL脚本这一点。

DECLARE @month int; 

SELECT @month = [month] FROM trialbalance_diff 

BEGIN 

IF @month = 1 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, jan) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 2 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, Feb) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 3 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, Mar) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 4 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, Apr) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 5 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, May) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 6 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, June) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 7 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, July) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 8 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, Aug) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 9 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, Sep) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 10 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, Oct) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 11 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, Nov) 
    SELECT accno, des, diff FROM trialbalance_diff 
ELSE IF @month = 12 
    INSERT INTO temp_TB_Diff(acc_code, acc_desc, [Dec]) 
    SELECT accno, des, diff FROM trialbalance_diff 

END 

它工作除了一个小问题。数据不会插入到特定的月份。应该转到不同月份列的值只能插入到一列中。

它看起来像这样,

acc_code Acc_desc   Jan  Feb  Mar  Apr  May 

1010011001 Cash in Hand            -732230.0 
1030033001 Seylan Bank            309042.0 
1050011001 Lease Debtors            9899.0 
1050011002 Lease VAT Suspense           2240.0 

我是什么在导致此脚本失踪?我似乎无法弄清楚为什么。

任何帮助,将不胜感激。非常感谢。

回答

1

使用情况声明如下:

INSERT INTO temp_TB_Diff 
    SELECT 
    accno, 
    des, 
    case when month = 1 then diff end as jan, 
    case when month = 2 then diff end as feb, 
    case when month = 3 then diff end as mar, 
    case when month = 4 then diff end as apr 
    .... 

    from trialbalance_diff 
+0

删除评论。 – Johan 2012-02-22 11:03:21

2

一个标量只是其中的一个值。您分配时将哪一行填充到变量中? SQL Server将选择一个任意的行。在这种情况下,它选择了5,所以只有一个查询被执行。蛮力的简单方法是:

INSERT INTO temp_TB_Diff(acc_code, acc_desc, Jan) 
    SELECT accno, des, diff FROM trialbalance_diff WHERE Month = 1; 

INSERT INTO temp_TB_Diff(acc_code, acc_desc, Feb) 
    SELECT accno, des, diff FROM trialbalance_diff WHERE Month = 2; 

INSERT INTO temp_TB_Diff(acc_code, acc_desc, Mar) 
    SELECT accno, des, diff FROM trialbalance_diff WHERE Month = 3; 

... 
+0

这将只在5月份插入一行 – Vikram 2012-02-22 06:09:44

+0

@Vikram:你可能会把这个与其他东西混淆。这个解决方案没有任何问题,并且所有'Month'是'5'的行都会被选中并插入,与其他月份一样。 – 2012-02-22 06:19:08

+0

@Aaron Bertrand我真的很困惑:) – Vikram 2012-02-22 06:24:29