Присвоение значения с описанием дела - PullRequest
0 голосов
/ 14 сентября 2011

Подскажите, пожалуйста, почему результаты, которые я получаю из следующего кода, неверны.

У меня есть 2 имени поля, одно с именем CheckAmount, а другое с именем ckeckNumber.

CheckNumber ofvarchar (25) и checkAmount имеют тип данных Money.

Каждый раз, когда сумма чека вставляется в БД, соответствующий номер чека также вставляется.

Однако, когда наличные деньги вставляются, checkNumberстолбец не заполнен.

Я пытаюсь вставить «Платеж наличными» в пустой столбец в столбце «Номер чека», когда код вставлен в столбец cashAmount со следующим кодом:

select 
 CASE 
  WHEN checknumber ='' AND isnull(checkAmount ,'0.0') is not null 
  THEN 'Cash Payment' 
 ELSE checknumber 
END As checknumber 
from mytable

Проблема дажеесли столбец чекового номера не пустой (необязательно нулевой), а сумма наличных не пустая (опять же, мы не говорим о нулевом), то в коде все еще вставляется «Наличный платеж»

Есть идеи?Я могу объяснить дальше, если это необходимо;Я не хочу быть слишком многословным.

25411025    25411025    16  1.00    1.0000
25411026    25411026    16  2.00    2.0000
    x   0   0.00    0.0000
    x   0   0.00    0.0000
    x   0   0.00    0.0000

ClientID   CheckNumber CheckAmount CashAmount
========== =========== =========== ==========
0000000340    25411025        1.00       0.00
0000000340    25411026        2.00       0.00
0000000340                    0.00       3.00
0000000340                    0.00      15.00
0000000340                    0.00       0.00

Ответы [ 3 ]

1 голос
/ 14 сентября 2011

isnull(checkAmount, '0.0') преобразует нулевую сумму checkAmount в '0.0', поэтому я не вижу, как результат может быть нулевым. Эта часть вашего утверждения всегда будет иметь значение true.

Вы уверены, что не хотите, чтобы эта часть читалась:

...AND isnull(checkAmount, '0.0') = '0.0'

Или я не понимаю твою проблему?

UPDATE:

основываясь на ваших комментариях, я думаю, вы хотите убедиться, что cheknumber не заполнен и столбец cashAmount не равен нулю:

select 
 CASE 
  WHEN isnull(checknumber, '')  = '' AND isnull(cashAmount, 0) <> 0
  THEN 'Cash Payment' 
 ELSE checknumber 
END As checknumber 
from mytable

Надеюсь, это правильно.

0 голосов
/ 14 сентября 2011

Это:

 WHEN checknumber ='' AND isnull(checkAmount ,'0.0') is not null 
  THEN 'Cash Payment' 
 ELSE checknumber 

Чтобы выбрать способ, которым вы указываете, он должен выглядеть примерно так:

SELECT
    ClientID
    ,CheckNumber
    ,CASE WHEN ISNULL(CheckNumber,'') <> '' THEN CheckAmount ELSE 0 END AS CheckAmount
    ,CASE WHEN ISNULL(CheckNumber,'') = '' THEN CashAmount ELSE 0 END AS CashAmount
FROM dbo.myTable

Это так просто ... либо есть проверканомер или нет;либо наличными, либо нет.

0 голосов
/ 14 сентября 2011

Что это дает для «неправильных» строк?

SELECT
  checknumber,
  cn_fallback = COALESCE(NULLIF(RTRIM(checknumber), ''), 'x'),
  cn_length = DATALENGTH(checknumber),
  checkAmount,
  ca_fallback = COALESCE(checkAmount, 0.0)
FROM mytable;

Дает ли этот запрос результат, который вы ищете?Я все еще пытаюсь выяснить, хотите ли вы пустую строку во втором столбце контрольного номера, когда "нет чека и нет денег":

SELECT *, CASE 
  WHEN RTRIM(checknumber) = '' 
  AND CheckAmount = 0
  AND CashAmount > 0
  THEN 'Cash Payment' 
 ELSE checknumber 
END As checknumber 
FROM dbo.mytable;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...