Строки в своих столбцах в зависимости от их значения
Вопрос
У меня есть запрос на выборку, который в настоящее время дает следующие результаты:
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 имеет кросс-таблицы запросов.