2010-10-12 20 views
2

J'écris un programme qui affiche les produits et les magasins dans lesquels ils peuvent être localisés.SQL: Développez 1 colonne en 3 sur la table de résumé

Jusqu'à présent, j'ai pu écrire une requête SQL qui affiche les données comme suit:

Product Availability 
Milk  Store1 
Candy  Store1 
Eggs  Store1 
Milk  Store2 
Eggs  Store2 
Candy  Store3 
Eggs  Store3 

Y at-il requête SQL que je peux utiliser pour avoir les produits regroupés sur la colonne de produits et les magasins à laquelle ils peuvent être situés élargi en 3 colonnes comme illustré ci-dessous?

Product Store1 Store2 Store3 
Milk  Yes  Yes  No 
Candy Yes  No  Yes 
Eggs  Yes  Yes  Yes 

Répondre

4
SELECT 
    Product, 
    MAX(CASE WHEN Availability='Store1' THEN 'Yes' ELSE 'No' END) AS Store1, 
    MAX(CASE WHEN Availability='Store2' THEN 'Yes' ELSE 'No' END) AS Store2, 
    MAX(CASE WHEN Availability='Store3' THEN 'Yes' ELSE 'No' END) AS Store3 
FROM YourTable 
GROUP BY Product 
+0

Une bonne solution, mais limitée par le nombre de magasins dans cet exemple. Si un nouveau magasin arrive, la requête devra être mise à jour. @ Martin: ne pouvons-nous le rendre dynamique? – Kangkan

+0

@Kangkan - Dépend du SGBD. Access a un opérateur 'transform'. SQL Server nécessiterait que toute la chaîne de requête soit générée dynamiquement. –

+0

Merci, Martin. Puisque la base de données est dans Access, j'ai utilisé 'IIf' au lieu de' CASE WHEN' et cela a fonctionné. –

3

Une question très commune. Le mot que vous devez savoir est pivot. Recherche StackOverflow pour "pivot", ou peut-être "cross tab" pour trouver beaucoup de discussions et d'exemples.

1

que vous ne présumant connaissez pas les noms de colonnes avant d'exécuter la requête, this blog donne une bonne solution (mais attention aux attaques par injection).

3

La plupart des RDBM supportent le pivot de nos jours. Cela aiderait beaucoup si vous spécifiez quelle base de données vous utilisez. Quelques exemples: MSSQL, postgres (the crosstab function) et ainsi de suite.

+1

Copier et coller échouer. Merci. – Donnie