2013-08-01 1 views
0

Я пишу сложный вид для отчета ниже:Наилучшая практика для зрения комплекса TSQL

SELECT  TOP (100) PERCENT dbo.tbl_SFCWRK_SQL_NF.ID, dbo.tbl_SFCWRK_SQL_NF.STD_LBR_HRS, dbo.tbl_SFCWRK_SQL_NF.CUSTNAME, 
        dbo.tbl_SFCWRK_SQL_NF.JOBNBR, CASE WHEN dbo.tbl_SFCWRK_SQL_NF.COMPQTY IS NULL THEN 0 ELSE CONVERT(decimal(10, 5), 
        dbo.tbl_SFCWRK_SQL_NF.COMPQTY) END AS COMPQTY, CASE WHEN dbo.tbl_SFCWRK_SQL_NF.ORDQTY IS NULL THEN 0 ELSE CONVERT(decimal(10, 5), 
        dbo.tbl_SFCWRK_SQL_NF.ORDQTY) END AS ORDQTY, dbo.tbl_SFCWRK_SQL_NF.PLAN_CD, dbo.tbl_SFCWRK_SQL_NF.PLANQTY, 
        dbo.tbl_SFCWRK_SQL_NF.ITEMNBR, dbo.tbl_ITEMMAST_NF.ITEM_NBR, dbo.tbl_SFCWRK_SQL_NF.WODUEDT, tbl_WORK_CENTR_NF.WRK_CENTER_DESC, 
        tbl_WORK_CENTR_NF.LABOR_CAPACITY, dbo.tbl_SFCWRK_SQL_NF.STD_SETUP_HRS, dbo.tbl_WIPOPER_NF.STD_LBR_HOURS, 
        dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE, dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR, dbo.tbl_WIPOPER_NF.OPER_STATUS, 
        dbo.tbl_WIPOPER_NF.OPERATION_NBR, tbl_WORK_CENTR_NF.WAREHOUSE, 
        CASE WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20005' THEN 1 WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20010' THEN 2 WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR 
        = '20020' THEN 3 WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20030' THEN 4 WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20040' THEN 5 WHEN 
        dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20050' THEN 6 WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20110' THEN 7 ELSE dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR 
        END AS WCOrder, DATEADD(dd, 7 - DATEPART(dw, dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE), dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE) AS WeekEnd, 
        DATEPART(wk, dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE) AS WkNum, 
        CASE WHEN dbo.tbl_SFCWRK_SQL_NF.COMPQTY <> 0 THEN ((dbo.tbl_SFCWRK_SQL_NF.STD_LBR_HRS/dbo.tbl_SFCWRK_SQL_NF.ORDQTY) 
        * (dbo.tbl_SFCWRK_SQL_NF.ORDQTY - dbo.tbl_SFCWRK_SQL_NF.COMPQTY)) 
        * 2 ELSE ((dbo.tbl_SFCWRK_SQL_NF.STD_LBR_HRS/dbo.tbl_SFCWRK_SQL_NF.ORDQTY) * (dbo.tbl_SFCWRK_SQL_NF.ORDQTY)) * 2 END AS RmnLabor, 
        CASE WHEN dbo.tbl_SFCWRK_SQL_NF.COMPQTY <> 0 THEN ((dbo.tbl_SFCWRK_SQL_NF.STD_SETUP_HRS/tbl_SFCWRK_SQL_NF.ORDQTY) 
        * (dbo.tbl_SFCWRK_SQL_NF.ORDQTY - dbo.tbl_SFCWRK_SQL_NF.COMPQTY)) 
       /100 ELSE ((dbo.tbl_SFCWRK_SQL_NF.STD_SETUP_HRS/dbo.tbl_SFCWRK_SQL_NF.ORDQTY) * (dbo.tbl_SFCWRK_SQL_NF.ORDQTY)) 
       /100 END AS RmnSetup 
FROM   dbo.tbl_ITEMMAST_NF INNER JOIN 
        dbo.tbl_SFCWRK_SQL_NF ON dbo.tbl_ITEMMAST_NF.CPN = dbo.tbl_SFCWRK_SQL_NF.CPN_NO INNER JOIN 
        dbo.tbl_WORK_CENTR_NF AS tbl_WORK_CENTR_NF ON dbo.tbl_SFCWRK_SQL_NF.WC_NBR = tbl_WORK_CENTR_NF.ID INNER JOIN 
        dbo.tbl_WIPOPER_NF ON dbo.tbl_SFCWRK_SQL_NF.ID = dbo.tbl_WIPOPER_NF.ID 
WHERE  (dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE <= DATEADD(m, 2, GETDATE())) AND (dbo.tbl_WIPOPER_NF.OPER_STATUS <> 'C' OR 
        dbo.tbl_WIPOPER_NF.OPER_STATUS IS NULL OR 
        dbo.tbl_WIPOPER_NF.OPER_STATUS = '') AND (tbl_WORK_CENTR_NF.WAREHOUSE = '02') AND (dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR IN ('20005', '20010', 
        '20020', '20030', '20040', '20060', '20110')) AND (NOT (dbo.tbl_ITEMMAST_NF.ITEM_NBR LIKE 'A%')) AND (CASE WHEN tbl_SFCWRK_SQL_NF.ORDQTY IS NULL 
        THEN 0 ELSE CONVERT(decimal(10, 5), tbl_SFCWRK_SQL_NF.ORDQTY) END <> 0) AND (CASE WHEN tbl_SFCWRK_SQL_NF.ORDQTY IS NULL 
        THEN 0 ELSE CONVERT(decimal(10, 5), tbl_SFCWRK_SQL_NF.ORDQTY) END <> 0) 
ORDER BY dbo.tbl_SFCWRK_SQL_NF.WODUEDT DESC 

Я хотел бы сделать это работать более эффективно. Мне также любопытно, что то, что я делаю, является правильным способом написать представление, и если я должен его реорганизовать ... ??

Райан

+0

Вы посмотрели на добавление каких-либо индексов? – ganders

+4

Добавление псевдонимов для ваших таблиц сделает ваш запрос более читаемым/управляемым ... –

+3

Особенно * короткие * (но значимые) псевдонимы. –

ответ

1

Во-первых, наилучшая практика на views не включает ORDER BY. Поэтому избавьтесь от TOP (100) PERCENT и операторов ORDER BY dbo.tbl_SFCWRK_SQL_NF.WODUEDT DESC. Затем отформатируйте свой запрос, чтобы он был легко читаемым. Я сделал это ниже, но если у вас другой формат, вы предпочитаете это использовать. Все дело в том, чтобы сделать его доступным для ВАС и ВАШИХ товарищей по команде/возможной замены.

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

  • tbl_ITEMMAST_NF (КПН, ITEM_NBR)
  • tbl_SFCWRK_SQL_NF (CPN_NO, WC_NBR, удостоверение личности, ORDQTY)
  • tbl_WIPOPER_NF (ID, SCHED_COMP_DATE, OPER_STATUS)

Они стартовое место на основе столбцы, которые вы используете в JOIN и в статье WHERE. Они могут быть не оптимальными, но, вероятно, лучше, чем ничего. Вы также можете проверить план выполнения и посмотреть, что оптимизатор предлагает что-то. Если он просматривает ваши существующие индексы и видит, подходит ли им к ним, и если да, добавьте его. Если нет, возможно, будет возможно изменить один из ваших существующих индексов, чтобы покрыть то, о чем он просит.

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

tbl_WIPOPER_NF(ID, SCHED_COMP_DATE, OPER_STATUS) INCLUDE WORK_CENTER_NBR 

Не просто добавить новый указатель.Измените старый, чтобы включить столбцы INCLUDE. Или оптимизатор может захотеть изменить порядок столбцов в индексе. Если это единственное место, где вы используете этот индекс (вы добавили его, потому что я его предложил), то измените его. Не добавляйте новый. То же самое касается моих предложений выше, по сравнению с уже имеющимися индексами.

Что касается самого запроса. Все хорошо. Существуют и другие способы обработки вещей, например, используя ISNULL вместо ваших операторов CASE в предложении WHERE. Но то, как у вас есть, должно работать нормально.

SELECT --TOP (100) PERCENT 
    dbo.tbl_SFCWRK_SQL_NF.ID, dbo.tbl_SFCWRK_SQL_NF.STD_LBR_HRS, 
    dbo.tbl_SFCWRK_SQL_NF.CUSTNAME, dbo.tbl_SFCWRK_SQL_NF.JOBNBR, 
    CASE WHEN dbo.tbl_SFCWRK_SQL_NF.COMPQTY IS NULL THEN 0 
     ELSE CONVERT(decimal(10, 5), dbo.tbl_SFCWRK_SQL_NF.COMPQTY) END AS COMPQTY, 
    CASE WHEN dbo.tbl_SFCWRK_SQL_NF.ORDQTY IS NULL THEN 0 
     ELSE CONVERT(decimal(10, 5), dbo.tbl_SFCWRK_SQL_NF.ORDQTY) END AS ORDQTY, 
    dbo.tbl_SFCWRK_SQL_NF.PLAN_CD, dbo.tbl_SFCWRK_SQL_NF.PLANQTY, 
    dbo.tbl_SFCWRK_SQL_NF.ITEMNBR, dbo.tbl_ITEMMAST_NF.ITEM_NBR, 
    dbo.tbl_SFCWRK_SQL_NF.WODUEDT, tbl_WORK_CENTR_NF.WRK_CENTER_DESC, 
    tbl_WORK_CENTR_NF.LABOR_CAPACITY, dbo.tbl_SFCWRK_SQL_NF.STD_SETUP_HRS, 
    dbo.tbl_WIPOPER_NF.STD_LBR_HOURS, dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE, 
    dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR, dbo.tbl_WIPOPER_NF.OPER_STATUS, 
    dbo.tbl_WIPOPER_NF.OPERATION_NBR, tbl_WORK_CENTR_NF.WAREHOUSE, 
    CASE WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20005' THEN 1 
     WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20010' THEN 2 
     WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20020' THEN 3 
     WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20030' THEN 4 
     WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20040' THEN 5 
     WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20050' THEN 6 
     WHEN dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20110' THEN 7 
     ELSE dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR END AS WCOrder, 
    DATEADD(dd, 7 - DATEPART(dw, dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE), 
    dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE) AS WeekEnd, DATEPART(wk, dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE) AS WkNum, 
    CASE WHEN dbo.tbl_SFCWRK_SQL_NF.COMPQTY <> 0 
     THEN ((dbo.tbl_SFCWRK_SQL_NF.STD_LBR_HRS/dbo.tbl_SFCWRK_SQL_NF.ORDQTY) * 
      (dbo.tbl_SFCWRK_SQL_NF.ORDQTY - dbo.tbl_SFCWRK_SQL_NF.COMPQTY)) * 2 
     ELSE ((dbo.tbl_SFCWRK_SQL_NF.STD_LBR_HRS/dbo.tbl_SFCWRK_SQL_NF.ORDQTY) * 
      (dbo.tbl_SFCWRK_SQL_NF.ORDQTY)) * 2 END AS RmnLabor, 
    CASE WHEN dbo.tbl_SFCWRK_SQL_NF.COMPQTY <> 0 
     THEN ((dbo.tbl_SFCWRK_SQL_NF.STD_SETUP_HRS/tbl_SFCWRK_SQL_NF.ORDQTY) * 
      (dbo.tbl_SFCWRK_SQL_NF.ORDQTY - dbo.tbl_SFCWRK_SQL_NF.COMPQTY))/100 
     ELSE ((dbo.tbl_SFCWRK_SQL_NF.STD_SETUP_HRS/dbo.tbl_SFCWRK_SQL_NF.ORDQTY) * 
      (dbo.tbl_SFCWRK_SQL_NF.ORDQTY))/100 END AS RmnSetup 
FROM dbo.tbl_ITEMMAST_NF 
INNER JOIN dbo.tbl_SFCWRK_SQL_NF 
    ON dbo.tbl_ITEMMAST_NF.CPN = dbo.tbl_SFCWRK_SQL_NF.CPN_NO 
INNER JOIN dbo.tbl_WORK_CENTR_NF AS tbl_WORK_CENTR_NF 
    ON dbo.tbl_SFCWRK_SQL_NF.WC_NBR = tbl_WORK_CENTR_NF.ID 
INNER JOIN dbo.tbl_WIPOPER_NF 
    ON dbo.tbl_SFCWRK_SQL_NF.ID = dbo.tbl_WIPOPER_NF.ID 
WHERE (dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE <= DATEADD(m, 2, GETDATE())) 
    AND (dbo.tbl_WIPOPER_NF.OPER_STATUS <> 'C' OR 
     dbo.tbl_WIPOPER_NF.OPER_STATUS IS NULL OR 
     dbo.tbl_WIPOPER_NF.OPER_STATUS = '') 
    AND (tbl_WORK_CENTR_NF.WAREHOUSE = '02') 
    AND (dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR IN ('20005', '20010', '20020', '20030', 
               '20040', '20060', '20110')) 
    AND (NOT (dbo.tbl_ITEMMAST_NF.ITEM_NBR LIKE 'A%')) 
    AND (CASE WHEN tbl_SFCWRK_SQL_NF.ORDQTY IS NULL THEN 0 
     ELSE CONVERT(decimal(10, 5), tbl_SFCWRK_SQL_NF.ORDQTY) END <> 0) 
    AND (CASE WHEN tbl_SFCWRK_SQL_NF.ORDQTY IS NULL THEN 0 
     ELSE CONVERT(decimal(10, 5), tbl_SFCWRK_SQL_NF.ORDQTY) END <> 0) 
--ORDER BY dbo.tbl_SFCWRK_SQL_NF.WODUEDT DESC 
+0

Спасибо, Кеннет Фишер, отличный ответ. Я ценю ваше время. Мне нужно добавить индексы по многим ранее запрограммированным представлениям – Ryan

+0

Я закончил тем, что просто поместил все вычеты в калибровочные поля в ssrs – Ryan

2

Это просто не имеет никакого смысла для меня

where  
(CASE 
     WHEN tbl_SFCWRK_SQL_NF.ORDQTY IS NULL THEN 0 
     ELSE CONVERT(decimal(10, 5), tbl_SFCWRK_SQL_NF.ORDQTY) END 
     <> 0) 

Если это нуль, то она возвращает ложь.
Но любое сравнение с null возвращает false.

Он должен быть числовым типом для преобразования в десятичный код для успеха.
С любым числовым типом <> 0 то же самое.

Довольно уверен, что может быть уменьшена до

where tbl_SFCWRK_SQL_NF.ORDQTY <> 0 

С вашим синтаксисом вы убиваете использование индекса по этому столбцу

Также <> «с» или = «» является излишним

Saw комментирует, что tbl_SFCWRK_SQL_NF.ORDQTY является varchar.
Это просто испортилось.
Это преобразование не будет выполнено, если значение varchar не будет десятичным.
Я просто предположил, что это должен быть какой-то тип.

+0

Blam, я унаследовал эту базу данных и отчеты от предыдущего сотрудника и перепрограммировал много просмотров и sp's :) – Ryan

+0

Собственно, если столбец должен быть преобразован * неявно *, (осмысленное) использование индекса также убивается. –

+0

@AndriyM Если это был числовой тип, когда <> 0 требовалось неявное преобразование? – Paparazzi

1

Я внес некоторые незначительные обновления и форматирование в запрос, который может быть полезен; проверка на IS NULL и пустую строку с использованием COALESCE вместо CASE операторов. Подробнее см. Ниже. Я не уверен, что это повлияет на производительность, но вы можете попробовать.

Обратите внимание, что последние критерии были указаны дважды. Я не уверен, что это было намеренно или нет, или если это даже повлияет на производительность. Дай мне знать. Если нет, я удалю этот ответ.

SELECT 
    dbo.tbl_SFCWRK_SQL_NF.ID, 
    dbo.tbl_SFCWRK_SQL_NF.STD_LBR_HRS, 
    dbo.tbl_SFCWRK_SQL_NF.CUSTNAME, 
    dbo.tbl_SFCWRK_SQL_NF.JOBNBR, 
    --CASE WHEN dbo.tbl_SFCWRK_SQL_NF.COMPQTY IS NULL THEN 0 ELSE CONVERT(decimal(10, 5), dbo.tbl_SFCWRK_SQL_NF.COMPQTY) END AS COMPQTY, 
    COALESCE(CONVERT(decimal(10, 5), dbo.tbl_SFCWRK_SQL_NF.COMPQTY), 0) AS COMPQTY 
    --CASE WHEN dbo.tbl_SFCWRK_SQL_NF.ORDQTY IS NULL THEN 0 ELSE CONVERT(decimal(10, 5), dbo.tbl_SFCWRK_SQL_NF.ORDQTY) END AS ORDQTY, 
    COALESCE(CONVERT(decimal(10, 5), dbo.tbl_SFCWRK_SQL_NF.ORDQTY), 0) AS ORDQTY 
    dbo.tbl_SFCWRK_SQL_NF.PLAN_CD, 
    dbo.tbl_SFCWRK_SQL_NF.PLANQTY, 
    dbo.tbl_SFCWRK_SQL_NF.ITEMNBR, 
    dbo.tbl_ITEMMAST_NF.ITEM_NBR, 
    dbo.tbl_SFCWRK_SQL_NF.WODUEDT, 
    tbl_WORK_CENTR_NF.WRK_CENTER_DESC, 
    tbl_WORK_CENTR_NF.LABOR_CAPACITY, 
    dbo.tbl_SFCWRK_SQL_NF.STD_SETUP_HRS, 
    dbo.tbl_WIPOPER_NF.STD_LBR_HOURS, 
    dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE, 
    dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR, 
    dbo.tbl_WIPOPER_NF.OPER_STATUS, 
    dbo.tbl_WIPOPER_NF.OPERATION_NBR, 
    tbl_WORK_CENTR_NF.WAREHOUSE, 
    CASE 
     WHEN 
      dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20005' 
     THEN 
      1 
     WHEN 
      dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20010' 
     THEN 
      2 
     WHEN 
      dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20020' 
     THEN 
      3 
     WHEN 
      dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20030' 
     THEN 
      4 
     WHEN 
      dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20040' 
     THEN 
      5 
     WHEN 
      dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20050' 
     THEN 
      6 
     WHEN 
      dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR = '20110' 
     THEN 
      7 
     ELSE 
      dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR 
     END 
      AS WCOrder, 
    DATEADD(dd, 7 - DATEPART(dw, dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE), dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE) AS WeekEnd, 
    DATEPART(wk, dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE) AS WkNum, 
    CASE 
     WHEN 
      dbo.tbl_SFCWRK_SQL_NF.COMPQTY <> 0 
     THEN 
      ((dbo.tbl_SFCWRK_SQL_NF.STD_LBR_HRS/dbo.tbl_SFCWRK_SQL_NF.ORDQTY) * (dbo.tbl_SFCWRK_SQL_NF.ORDQTY - dbo.tbl_SFCWRK_SQL_NF.COMPQTY)) * 2 
     ELSE 
      ((dbo.tbl_SFCWRK_SQL_NF.STD_LBR_HRS/dbo.tbl_SFCWRK_SQL_NF.ORDQTY) * (dbo.tbl_SFCWRK_SQL_NF.ORDQTY)) * 2 
     END AS RmnLabor, 
    CASE 
     WHEN 
      dbo.tbl_SFCWRK_SQL_NF.COMPQTY <> 0 
     THEN 
      ((dbo.tbl_SFCWRK_SQL_NF.STD_SETUP_HRS/tbl_SFCWRK_SQL_NF.ORDQTY) * (dbo.tbl_SFCWRK_SQL_NF.ORDQTY - dbo.tbl_SFCWRK_SQL_NF.COMPQTY))/100 
     ELSE 
      ((dbo.tbl_SFCWRK_SQL_NF.STD_SETUP_HRS/dbo.tbl_SFCWRK_SQL_NF.ORDQTY) * (dbo.tbl_SFCWRK_SQL_NF.ORDQTY))/100 
     END AS RmnSetup 
FROM 
    dbo.tbl_ITEMMAST_NF INNER JOIN dbo.tbl_SFCWRK_SQL_NF 
     ON 
      dbo.tbl_ITEMMAST_NF.CPN = dbo.tbl_SFCWRK_SQL_NF.CPN_NO INNER JOIN dbo.tbl_WORK_CENTR_NF AS tbl_WORK_CENTR_NF 
       ON 
        dbo.tbl_SFCWRK_SQL_NF.WC_NBR = tbl_WORK_CENTR_NF.ID INNER JOIN dbo.tbl_WIPOPER_NF 
         ON 
          dbo.tbl_SFCWRK_SQL_NF.ID = dbo.tbl_WIPOPER_NF.ID 
WHERE 
    dbo.tbl_WIPOPER_NF.SCHED_COMP_DATE <= DATEADD(m, 2, GETDATE()) 
     AND 
    (
     dbo.tbl_WIPOPER_NF.OPER_STATUS <> 'C' 
      OR 
     --dbo.tbl_WIPOPER_NF.OPER_STATUS IS NULL OR dbo.tbl_WIPOPER_NF.OPER_STATUS = '' 
     --Replace the above statement with the following... 
     COALESCE(dbo.tbl_WIPOPER_NF.OPER_STATUS, N'') = N'' 
    ) 
     AND 
    tbl_WORK_CENTR_NF.WAREHOUSE = '02' 
     AND 
    dbo.tbl_WIPOPER_NF.WORK_CENTER_NBR IN ('20005', '20010', '20020', '20030', '20040', '20060','20110') 
     AND 
    dbo.tbl_ITEMMAST_NF.ITEM_NBR NOT LIKE 'A%' 
     AND 
    --CASE WHEN tbl_SFCWRK_SQL_NF.ORDQTY IS NULL THEN 0 ELSE CONVERT(decimal(10, 5), tbl_SFCWRK_SQL_NF.ORDQTY) END <> 0 
    --I would change the above statement to this... 
    COALESCE(tbl_SFCWRK_SQL_NF.ORDQTY, 0) <> 0 

     --AND 
    --CASE WHEN tbl_SFCWRK_SQL_NF.ORDQTY IS NULL THEN 0 ELSE CONVERT(decimal(10, 5), tbl_SFCWRK_SQL_NF.ORDQTY) END <> 0 
    --The above statement is a duplicate! 
ORDER BY 
    dbo.tbl_SFCWRK_SQL_NF.WODUEDT DESC 
+0

См. Комментарий, что tbl_SFCWRK_SQL_NF.ORDQTY - это varchar. где '0.0 '<>' 0 'возвращает true – Paparazzi

+0

Если я это делаю COALESCE (CONVERT (десятичный (10, 5), dbo.tbl_SFCWRK_SQL_NF.COMPQTY), 0) AS COMPQTY, COALESCE (CONVERT (десятичный (10, 5), dbo.tbl_SFCWRK_SQL_NF.ORDQTY), 0) AS ORDQTY then shouldnt Я использую эти имена столбцов псевдонима в calcs? – Ryan

+0

@ Ryan, вы говорите в разделе where? Если это так, то вы не можете использовать столбцы с псевдонимом в предложении where, если вы не используете подзапрос. Будет ли это повышать производительность? Возможно, что-то, на что можно подумать. – JoeFletch

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