Удалить значения строк и преобразовать в значение одного столбца

#sql #sql-server #stored-procedures

#sql #sql-сервер #хранимые процедуры

Вопрос:

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

 ID | Type | Price | Description
-------------------------------
7  | J    | 50.00 | Job
7  | F    | 20.00 | Freight
7  | P    | 30.00 | Postage
7  | H    |  5.00 | Handling
  

Я бы хотел, чтобы он возвращал таблицу следующим образом:

 ID | Type | Price | Description | FreightPrice
-----------------------------------------
7  | J    | 50.00 | Job         | 20.00
7  | P    | 30.00 | Postage     | 20.00
7  | H    |  5.00 | Handling    | 20.00
  

Есть ли способ, которым я могу использовать запрос, такой как:

 SELECT * FROM Temp WHERE Type = 'F'
  

но вместо этого возвращать строку «Фрахт» в виде столбца только со значением «Цена»?

Из того, что я видел, кажется, что мне может потребоваться использовать оператор PIVOT для достижения этой цели, но это кажется слишком сложным. Есть ли способ, которым я мог бы достичь этого результата, используя выражение CASE или IF?

Ответ №1:

На основе предоставленных вами данных имеется одна строка со значением описания: «Перевозка». Предполагая, что это так, попробуйте:

 select ID,Type,Price,Description,
       FreightPrice = (select Price 
                       from mytable 
                       where Description = 'Freight')
from mytable
where Description <> 'Freight'
  

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

1. Да, мы получили то же самое 🙂 Я не знал, что вы могли бы сделать FreightPrice = ... в SQL Server. В любом случае 1

2. @TheImpaler существует несколько способов записи псевдонимов в sql server. Аарон Бертран отлично справляется с их рассмотрением здесь .

3. Это сделало свое дело, я, по-видимому, переусердствовал. Спасибо Eray и Impaler. Я приму этот ответ, поскольку он был первым.

4. @SeanLange Хорошая статья.

Ответ №2:

Если Freight строка всегда перемещается вправо, вы можете жестко запрограммировать эту логику (предполагая, что это всегда одна строка), как в:

 select
  id,
  type,
  price,
  description,
  (select price from t where description = 'Freight') as freightprice
from t
where description <> 'Freight'
  

Примечание: этот запрос завершится сбоем, если в вашей таблице будет более одной строки для Freight .

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

1. Спасибо за проверку моего ответа 🙂