2012-02-22 2 views
1

Я использую SQL Server 2000. Существует таблица с именем trialbalance_diff. Структура показана ниже.SQL-скрипт с IF ELSE не работает должным образом

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

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

это будет только вставить одну строку за майский месяц – Vikram

+0

@Vikram: Вы, вероятно, путаете это с чем-то другим. В этом решении нет ничего плохого, и все строки, где 'Month'' '' 5', будут выбраны и вставлены, то же самое с другими месяцами. –

+0

@ Аарон Бертран, я действительно смутился :) – Vikram

Смежные вопросы