2013-09-06 2 views
0

Я пытаюсь вычислить поле. Например,Расчет поля SQL на основе CASE, если затем еще

select **sum(New)** as NewCST where WHERE PO ='L22411301' AND ItemNo IN('1730','1343'). 

Вместо суммы у меня есть это дело всего дела для реализации. Я не сделал расчет формулы, у которого есть много условий. Поэтому любая помощь приветствуется.

До сих пор я получил это:

SELECT * 
FROM (SELECT 
    Case 
     When PO_SIZE like ‘%lb%’ Then CONVERT(decimal(13,4), NET_COST/TOTAL_WEIGHT) 
     When PO_SIZE like ‘%LB%’ Then CONVERT(decimal(13,4), NET_COST/TOTAL_WEIGHT) 
     Else CONVERT(decimal(13,4), ADJ_EXT_NET_COST/LINE_QUANTITY)   
from [FirstStrike_Retail].[custom].[Whse_Line_Item])End AS NewCst. 
WHERE PO ='L22411301' AND ItemNo IN('1730','1343') 
+0

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

ответ

2

Там нет необходимости для внешнего выбора даного. Кроме того, вы должны закрыть оператор CASE с помощью ключевого слова END, прежде чем перейти к статье FROM.

Настоящая приведенная в вашем распоряжении версия вашего кода.

SELECT Case When PO_SIZE like ‘%lb%’ Then CONVERT(decimal(13,4), NET_COST/TOTAL_WEIGHT) 
       When PO_SIZE like ‘%LB%’ Then CONVERT(decimal(13,4), NET_COST/TOTAL_WEIGHT) 
       Else CONVERT(decimal(13,4), ADJ_EXT_NET_COST/LINE_QUANTITY) 
     End AS NewCst 
from [FirstStrike_Retail].[custom].[Whse_Line_Item]) 
WHERE PO ='L22411301' 
AND  ItemNo IN('1730','1343') 
0
select 
    sum(Case When PO_SIZE like ‘%lb%’ Then CONVERT(decimal(13,4), NET_COST/TOTAL_WEIGHT) 
    When PO_SIZE like ‘%LB%’ Then CONVERT(decimal(13,4), NET_COST/TOTAL_WEIGHT) 
    Else CONVERT(decimal(13,4), ADJ_EXT_NET_COST/LINE_QUANTITY)END)NewCst 
from 
    [FirstStrike_Retail].[custom].[Whse_Line_Item] 
WHERE 
    PO ='L22411301' AND ItemNo IN('1730','1343') 
1

Первое решение, безусловно, имеет синтаксические ошибки. Я предполагаю, что у меня есть вопрос, который вам нужен для вычисления на уровне строки (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), почему бы не преобразовать строку в нижний регистр перед совпадением шаблона?

Полученные результаты запроса ниже.

enter image description here

Пища для размышлений, если вы работаете в этом запросе много раз в течение дня, вы можете иметь сохраненное вычисляемое поле.

Оформить заявку MSDN entry на 2012 год. Это избавит двигатель от необходимости рассчитывать поле каждый раз за счет хранения результатов на диске.

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

  • Нет связанных вопросов^_^