Строки в своих столбцах в зависимости от их значения

StackOverflow https://stackoverflow.com/questions/236236

  •  04-07-2019
  •  | 
  •  

Вопрос

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

Description   Code    Price
 Product 1     A        5
 Product 1     B        4
 Product 1     C        2

Используя следующий запрос:

SELECT DISTINCT np.Description, p.promotionalCode, p.Price
FROM            Price AS p INNER JOIN
                         nProduct AS np ON p.nProduct = np.Id

Я хочу произвести следующее:

Description  A  B  C
 Product 1   5  4  2
Это было полезно?

Решение

SELECT 
    np.Id, 
    np.Description, 
    MIN(Case promotionalCode WHEN 'A' THEN Price ELSE NULL END) AS 'A',
    MIN(Case promotionalCode WHEN 'B' THEN Price ELSE NULL END) AS 'B',
    MIN(Case promotionalCode WHEN 'C' THEN Price ELSE NULL END) AS 'C'
FROM 
    Price AS p 
INNER JOIN nProduct AS np ON p.nProduct = np.Id
GROUP BY 
    np.Id,
    np.Description
<Ч>

Вот простой пример теста:

DECLARE @temp TABLE (
    id INT,
    description varchar(50),
    promotionalCode char(1),
    Price smallmoney
)

INSERT INTO @temp
select 1, 'Product 1', 'A', 5
    union
SELECT 1, 'Product 1',  'B', 4
    union
SELECT 1, 'Product 1', 'C', 2



SELECT
    id,
    description,
    MIN(Case promotionalCode WHEN 'A' THEN Price ELSE NULL END) AS 'A',
    MIN(Case promotionalCode WHEN 'B' THEN Price ELSE NULL END) AS 'B',
    MIN(Case promotionalCode WHEN 'C' THEN Price ELSE NULL END) AS 'C'
FROM
     @temp
GROUP BY 
    id,
    description

Другие советы

Если вы используете SQL Server 2005, вы можете использовать новый оператор PIVOT.

Simple PIVOT - количество заказов, которые заказчик размещает на отдельные товары.

Структура простой таблицы заказов:

CREATE TABLE Sales.[Order]
    (Customer varchar(8), Product varchar(5), Quantity int)

Таблица содержит следующие значения:

Customer Product Quantity
    Mike     Bike    3
    Mike     Chain   2
    Mike     Bike    5
    Lisa     Bike    3
    Lisa     Chain   3
    Lisa     Chain   4

Пример: операция PIVOT в таблице заказов:

SELECT *
    FROM Sales.[Order]
    PIVOT (SUM(Quantity) FOR Product IN ([Bike],[Chain])) AS PVT

Ожидаемый результат этого запроса:

Customer Bike Chain
Lisa        3    7
Mike        8    2

Если вы не используете SQL Server, вы можете найти " pivot " для вашей базы данных.

Ответ Дакворта хорош. Если вы можете получить более одного значения для каждой ячейки, вы можете использовать AVG или SUM вместо MIN, в зависимости от того, что вы хотите видеть.

Если ваша СУБД поддерживает это, вам также может потребоваться запрос кросс-таблицы или сводный запрос. Например, MS Access имеет кросс-таблицы запросов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top