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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top