【问题标题】:SQL script with IF ELSE not working properly带有 IF ELSE 的 SQL 脚本无法正常工作
【发布时间】:2012-02-22 05:59:58
【问题描述】:

我使用的是 SQL Server 2000。有一个名为 trialbalance_diff 的表。结构如下图。

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

导致此问题的脚本中缺少什么?我似乎无法弄清楚为什么。

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

【问题讨论】:

    标签: sql tsql sql-server-2000


    【解决方案1】:

    标量变量只是一个值。当您分配变量时,您认为哪一行填充了变量? 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;
    
    ...
    

    【讨论】:

    • 这只会在 5 月份插入一行
    • @Vikram:你可能把它和别的东西混淆了。这个解决方案没有问题,所有Month5的行都会被选中并插入,与其他月份一样。
    • @Aaron Bertrand 我真的很困惑 :)
    【解决方案2】:

    用例语句如下:

     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
    

    【讨论】:

      猜你喜欢
      • 2014-11-16
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2022-11-03
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多