2011-09-07 6 views
-3

SQL 2008 - простая логика запросов.SQL Multiplication - Update Query

В моей таблице: TableName, у меня есть 3 столбца [Корабль Qty], Размер, Кол-во.

Значение по умолчанию для Qty равно NULL. Я написал Update Query для обновления столбца: Qty. Мне нужно умножить размер [Ship Qty] *.

Колонка: Размер nvarchar. Он несет в себе два

Условия работы

1) Если значение равно 60 EA или 3 ML, мне нужно рассматривать только 60 или 3 или 3,5 ...

2) Если значение 60X3 ML, мне нужно, чтобы рассмотреть 60X3, который равен 180. Затем это умноженное значение будет умножено на [Корабль Qty].

update [TableName] 
set Qty = [Ship Qty] * CONVERT(INT, (Size)) * CONVERT(Float, (Size))  
      WHERE Size > 0   
      AND Size > 0   
      AND Qty IS NULL 


Ship Qty Size    Qty 
1   100 EA   100 
3   60 EA   180 
2   60X3ML   360 

В приведенной выше таблице столбец: количество обновляется с помощью SQL-запроса. Мой запрос вызывает исключение.

+3

ЧТО исключение? И столбец количества, называемый 'Qty' или' [Ship Qty] '? И почему вы умножаетесь на 'Size' дважды? И как указывает Мат, какой ответ вы ожидаете от 3, умноженного на «EA»? –

+0

'Размер> 0 И Размер> 0'? Преобразование 'Size' в Int и Float? Когда это явно не в вашей выборке? – Mat

+0

Не 'CONVERT (INT, (Размер))' пытается (и не удается) отличать «EA» как целое число? –

ответ

1

Плохой/нечетный дизайн, но для чего мы надеемся одноразовое исправление;

;with TEST ([Ship Qty], Size) as (
    select 1,'100 EA' union all 
    select 3,'60 EA' union all 
    select 2,'60X3ML' union all 
    select 2,'60X2ML' union all 
    select 2,'60'  union all 
    select 2,'1 X3PP' 
) 
select 
    [Ship Qty], 
    Size, 
    [Ship Qty] * (
      cast(substring(Size, 1, patindex('%[^0-9]%', Size + '/') - 1) as int) 
      * 
      case when charindex('X', Size, 1) > 0 then 
       cast(substring(substring(Size, charindex('X', Size) + 1, len(Size)), 1, patindex('%[^0-9]%', substring(Size, charindex('X', Size) + 1, len(Size)) + '/') - 1) as int) 
      else 
       1 
      end 
     ) 
from TEST 

Для

Ship Qty Size (No column name) 
1   100 EA 100 
3   60 EA 180 
2   60X3ML 360 
2   60X2ML 240 
2   60  120 
2   1 X3PP 6 
+0

спасибо, ваш синтаксис работает. Мне нужно переделать по моему столу. !! – goofyui

+0

У меня есть небольшая коррекция по вышеуказанному запросу. Запрос работает хорошо. Но если это 60X2.5ML, я получаю вывод как 120, а не как 150 – goofyui

+0

Я изменил int на float, но столкнулся с теми же проблемами – goofyui

1

У вас есть несколько проблем:

  • Первый: Мне кажется, что ваше умножение может вернуть поплавок и все же в столбце QTY выглядит определяется как целое число
  • Второй (определенно вопрос): Вы конвертируете столбец «Размер», который имеет строки для float. Как вы ожидаете, что это сработает?
  • В-третьих: Почему у вас есть два столбца QTY в данных примера? Где находится колонка корабля QTY, на которую вы ссылаетесь?
+0

@lcarus, пожалуйста, проверьте значения сейчас .. Я отредактировал публикацию – goofyui

+0

В столбце: Размер, мне нужно обрезать строковые символы, кроме буквы X. Если есть письмо: X - мне нужно умножить .. !! Например, 60 X 3 - 180! – goofyui

+0

@Chok: Я вижу ваше редактирование. Мой ответ по-прежнему сохраняется. Вы конвертируете Size в float, но столбец Size содержит символы без цифр! Вы не можете этого сделать! – Icarus