Строки в своих столбцах в зависимости от их значения - PullRequest
3 голосов
/ 25 октября 2008

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

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

Ответы [ 3 ]

6 голосов
/ 25 октября 2008
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
2 голосов
/ 25 октября 2008

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

Простой 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» для вашей базы данных.

1 голос
/ 25 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...