упорядочить по данным sql с использованием условий (case) на основе производных столбцов - PullRequest
1 голос
/ 15 ноября 2011

Я хочу поставить условие для сортировки данных SQL на основе значения производных столбцов следующим образом:

SELECT DISTINCT sp.ID
    , sp.Status
    , sp.Rank
    , sp.Price
    , sp.SalePrice
    , sp.Width
    , sp.Height
    , sp.QOH
    , (sp.SalePrice*sp.QOH) As 'sp.Value'
    , (sp.Price*sp.QOH) As 'sp.StandardValue'
FROM table 
WHERE -- Conditions
ORDER BY
  CASE WHEN 'sp.SalePrice' > 0 THEN 'sp.Value'  END DESC,
  CASE WHEN 'sp.SalePrice' = 0 THEN 'sp.StandardValue'  END DESC

Дает эту ошибку:

Сообщение 145, Уровень 15, Состояние 1, Строка 1
Элементы ORDER BY должны отображаться в списке выбора, если указано SELECT DISTINCT.

если я попробую

ORDER BY
  CASE WHEN sp.SalePrice > 0 THEN (sp.SalePrice*sp.QOH) As "sp.Value"  END DESC,
  CASE WHEN sp.SalePrice = 0 THEN (sp.Price*sp.QOH) As sp.StandardValue" END DESC

выдает ошибку:

Неверный синтаксис рядом с ключевым словом «Как».

он начинает выдавать ту же ошибку выбора, если я пытаюсь удалить псевдонимы *, как в порядке с помощью cluase и оставить только часть умножения

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

Я собираюсь добавить несколько предложений об общих соглашениях ниже, но в качестве основной проблемы рассмотрим, что вы пытаетесь сделать с этим примером:

my_table:

id    value
1     1
2     2
3     1

Теперь попробуйте показать различное value упорядочение по идентификатору. Что это должно быть?

value
1
2

или

value
2
1

Итак, вы просите SQL Server сделать что-то, что может быть невозможным или, по крайней мере, неясным.

Теперь, что касается условных обозначений ... Возможно, кое-что из того, что вы написали здесь, но я бы сделал следующие предложения для вашего кода:

Избегайте использования зарезервированных слов и слов языка SQL для имен. Это будет включать table, rank и status.

Избегайте использования специальных символов в именах. Это будет включать sp.value. Конечно, вы можете сделать это с помощью заключенного в кавычки идентификатора, но некоторые внешние интерфейсы и т. Д. Могут не поддерживать их, даже если SQL поддерживает, и вы в большинстве случаев ничего не покупаете, используя их.

Используйте указанный в кавычках идентификатор, когда вам нужно указывать имена. Если вам абсолютно необходимо нарушить одно из двух приведенных выше предложений, используйте стандартные идентификаторы в кавычках для SQL Server: [ и ]. Если вы хотите использовать псевдонимы в кавычках, используйте их также (и вам не нужно, как правило, заключать в кавычки псевдонимы). Это помогает избежать проблемы, на которую указывает Марк Б.

Ваше утверждение CASE может быть лучше записано в виде одного столбца заказа. Кроме того, вы должны включить ELSE в большинстве случаев, чтобы избежать необработанных условий. Это может не понадобиться, если вы не можете иметь значения NULL или отрицательные значения ни в одном из задействованных столбцов.

CASE
    WHEN sp.SalePrice > 0 THEN (sp.SalePrice*sp.QOH)
    WHEN sp.SalePrice = 0 THEN (sp.Price*sp.QOH)
END

Я бы лично не использовал псевдоним таблицы (который, похоже, случайно пропущен в вашем запросе) в качестве псевдонимов столбцов. Это делает его гораздо более запутанным, поскольку выглядит так, что псевдоним столбца на самом деле является столбцом в таблице.

1 голос
/ 15 ноября 2011

Ваш второй пример наиболее близок, поскольку он правильно указывает столбцы.Однако вы не можете использовать псевдоним столбцов в порядке.Это будет работать:

ORDER BY
  CASE WHEN sp.SalePrice > 0 THEN sp.SalePrice*sp.QOH END DESC,
  CASE WHEN sp.SalePrice = 0 THEN sp.Price*sp.QOH END DESC

Или просто использовать псевдоним, который вы определили в наборе результатов:

ORDER BY
  CASE WHEN sp.SalePrice > 0 THEN [sp.Value] END DESC,
  CASE WHEN sp.SalePrice = 0 THEN [sp.StandardValue] END DESC

Обратите внимание на скобки [] .... это необходимо для определенияимя столбца, поскольку вы использовали точечное имя в псевдониме ... в противном случае sp.Value будет считаться столбцом значения в таблице sp.

1 голос
/ 15 ноября 2011

использование ' вокруг имен полей превращает их в строки. Либо полностью удалите кавычки, либо используйте ".

...