Сценарий SQL с IF ELSE не работает должным образом - PullRequest
1 голос
/ 22 февраля 2012

Я использую 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

Чего мне не хватает в сценарии, который вызывает это? Я не могу понять, почему.

Любая помощь будет оценена. Большое спасибо.

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

Скалярная переменная - это всего лишь одно значение.Как вы думаете, какая строка заполняет переменную при ее назначении?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;

...
1 голос
/ 22 февраля 2012

использование прецедента следующим образом:

 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
...