Rangées dans leurs propres colonnes en fonction de leur valeur
Question
J'ai une requête de sélection produisant les résultats suivants:
Description Code Price
Product 1 A 5
Product 1 B 4
Product 1 C 2
À l'aide de la requête suivante:
SELECT DISTINCT np.Description, p.promotionalCode, p.Price
FROM Price AS p INNER JOIN
nProduct AS np ON p.nProduct = np.Id
Je souhaite produire les éléments suivants:
Description A B C
Product 1 5 4 2
La solution
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
Voici un exemple de test simple:
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
Autres conseils
Si vous utilisez SQL Server 2005, vous pouvez utiliser le nouvel opérateur PIVOT.
PIVOT simple: nombre de commandes passées par un client pour des produits individuels.
Structure d'un tableau d'ordre simple:
CREATE TABLE Sales.[Order]
(Customer varchar(8), Product varchar(5), Quantity int)
Le tableau contient les valeurs suivantes:
Customer Product Quantity
Mike Bike 3
Mike Chain 2
Mike Bike 5
Lisa Bike 3
Lisa Chain 3
Lisa Chain 4
Ex: une opération PIVOT sur la table de commande:
SELECT *
FROM Sales.[Order]
PIVOT (SUM(Quantity) FOR Product IN ([Bike],[Chain])) AS PVT
Le résultat attendu de cette requête est:
Customer Bike Chain
Lisa 3 7
Mike 8 2
Si vous n'utilisez pas SQL Server, vous pouvez rechercher " pivot " pour votre base de données.
La réponse de Duckworth est bonne. Si vous pouvez obtenir plusieurs valeurs pour chaque cellule, vous pouvez utiliser AVG ou SUM au lieu de MIN, selon ce que vous souhaitez voir.
Si votre SGBD le prend en charge, vous pouvez également consulter une requête analyse croisée, ou une requête pivot. Par exemple, MS Access contient des requêtes d'analyse croisée.