Первое решение, безусловно, имеет синтаксические ошибки. Я предполагаю, что у меня есть вопрос, который вам нужен для вычисления на уровне строки (declan_k) или на уровне группировки (сонам).
Однако в приведенном выше коде (решения) есть некоторая избыточность. Кроме того, «Lb» для PO_SIZE не будет правильно рассчитать.
Давайте немного повеселимся!
Я всегда хотел создать образец базы данных при выполнении этих ответов.
-- Sample table
CREATE TABLE #WHSE_LINE_ITEM
(
ITEM_ID INT,
PO_NUM VARCHAR(10),
ITEM_NUM VARCHAR(10),
NET_COST REAL,
ADJ_EXT_NET_COST REAL,
LINE_QUANTITY INT,
TOTAL_WEIGHT REAL,
PO_SIZE VARCHAR(10)
);
-- Sample data
INSERT INTO #WHSE_LINE_ITEM
VALUES
(1, 'L22411301', '1730', 200.00, 0.0, 3.0, 15.0, 'LB'),
(2, 'L22411301', '1730', 150.00, 0.0, 3.0, 30.0, 'lb'),
(3, 'L22411301', '1343', 100.00, 0.0, 4.0, 0.0, 'LN');
Я сделал расчет на уровне рядов. Надеюсь, это то, что искали.
-- Calculate field using case stmt
SELECT
CASE
WHEN (LOWER(PO_SIZE) like '%lb%') THEN
CAST((NET_COST/TOTAL_WEIGHT) AS DECIMAL (13,4))
ELSE
CAST((NET_COST/LINE_QUANTITY) AS DECIMAL (13,4))
END AS NEWCST,
*
FROM
#WHSE_LINE_ITEM
WHERE
PO_NUM = 'L22411301' AND
ITEM_NUM IN('1730','1343');
При взгляде на код я всегда стараюсь уменьшить размер до минимума. Если вы тестируете все комбинации фунта (Lb, lB, lb или LB), почему бы не преобразовать строку в нижний регистр перед совпадением шаблона?
Полученные результаты запроса ниже.
Пища для размышлений, если вы работаете в этом запросе много раз в течение дня, вы можете иметь сохраненное вычисляемое поле.
Оформить заявку MSDN entry на 2012 год. Это избавит двигатель от необходимости рассчитывать поле каждый раз за счет хранения результатов на диске.
fyi: См. [Здесь] (http://stackoverflow.com/questions/14962419/is-the-like-operator-case-sensitive-with-ms-sql-server) для случая-чувствительности 'LIKE' , Вы также можете комбинировать тесты «LIKE», например. 'когда PO_Size нравится«% lb% »или PO_Size, например«% oz% », а затем Net_Cost/Total_Weight', так что вам не нужно повторять расчет. – HABO