Может кто-нибудь помочь мне расшифровать этот запрос? Запутанные операторы case

#sql #sql-server #case

#sql #sql-сервер #case

Вопрос:

Мне трудно читать этот запрос. Мне нужно избавиться от всего, что связано с «ShowStandadrdCost», так что внешний регистр. Но, похоже, я не могу понять, какие именно строки нужно удалить.

 (CASE WHEN ISNULL(ShowStandardCost, 0) = 0 THEN
                CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
                        THEN ISNULL(s.Standard_Cost, 0)
                        ELSE s.Actual_Cost  
                END
             ELSE ISNULL(s.Standard_Cost, 0)
        END   (CASE WHEN ISNULL(ShowStandardCost, 0) = 0 THEN
                CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
                        THEN ISNULL(s.Standard_Cost, 0)
                        ELSE s.Actual_Cost  
                END
             ELSE ISNULL(s.Standard_Cost, 0)
        END ) Item_Cost_Per,
  

Весь запрос просто

 CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
                            THEN ISNULL(s.Standard_Cost, 0)
                            ELSE s.Actual_Cost
  

Что добавляется, я не могу сказать.

Комментарии:

1. CASE выражение, а не оператор. CASE Выражение и CASE оператор сильно отличаются, и SQL Server не поддерживает последнее.

2. Не уверен, что я понимаю, о чем вы спрашиваете здесь, вы просто просите нас объяснить, что делает первый фрагмент запроса? Какие части вы понимаете или не понимаете?

3. Я понимаю, что суть запроса заключается в том, что если фактическая стоимость равна нулю, используйте стандартную стоимость (я думаю), но я не понимаю, что делают все эти операторы case.

4. Некоторые примеры данных также могут быть полезны.

5. Вот как я читаю запрос. Когда ShowStandCost равно null, затем используйте фактическую стоимость, если она не равна null, затем используйте стандартную стоимость. Когда значение show standard cost не равно null, используйте значение standard cost . И затем это умножает это число на два? (добавляя его к себе) Я прав?

Ответ №1:

Вероятно, так я бы написал выражение.

 CASE WHEN ShowStandardCost <> 0 --Maybe (ShowStandardCost = 1)?
    THEN ISNULL(s.Standard_Cost, 0)
    ELSE --Show Actual Cost, unless it's zero or null. 
         --If so, show Standard_Cost unless it's null. 
         --Only show zero if both columns are zero or null.
        COALESCE( NULLIF( s.Actual_Cost, 0), s.Standard_Cost, 0)
    END * 2 --The CASE expression is just repeating itself.
  

Ответ №2:

попробуйте это, не уверен, хотите ли вы этого,

 CASE WHEN ISNULL(s.Actual_Cost, 0) = 0 THEN ISNULL(s.Standard_Cost, 0) ELSE s.Actual_Cost end Item_Cost_Per
  

Фактический запрос прокомментирован ниже,

 /*(CASE WHEN ISNULL(ShowStandardCost, 0) = 0 THEN */
                CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
                        THEN ISNULL(s.Standard_Cost, 0)
                        ELSE s.Actual_Cost  
                END
            /* ELSE ISNULL(s.Standard_Cost, 0)
        END   (CASE WHEN ISNULL(ShowStandardCost, 0) = 0 THEN
                CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
                        THEN ISNULL(s.Standard_Cost, 0)
                        ELSE s.Actual_Cost  
                END
             ELSE ISNULL(s.Standard_Cost, 0)
        END ) */ Item_Cost_Per,
  

Ответ №3:

 If ShowStandardCost = null Then
   If Actual_Cost =  null Then
       If Standard_Cost = null Then 0 Else Standard_Cost
   Else Actual_Cost
End
  

Затем оператор повторяется и добавляет это значение к самому себе. Я бы просто окружил первую часть скобками и добавил «* 2» в конце, если бы это был я.

 (CASE WHEN ISNULL(ShowStandardCost, 0) = 0 THEN
         CASE WHEN ISNULL(s.Actual_Cost, 0) = 0
                THEN ISNULL(s.Standard_Cost, 0)
                ELSE s.Actual_Cost  
         END
      ELSE ISNULL(s.Standard_Cost, 0)
  END) * 2