Maison >base de données >tutoriel mysql >Comment faire pivoter une table PostgreSQL pour afficher le prix moyen par chambre et par quartier ?
Création d'un tableau croisé dynamique dans PostgreSQL
PostgreSQL utilise la fonction crosstab()
pour créer des tableaux croisés dynamiques. Cette fonction accepte deux entrées : une requête et une liste de noms de colonnes. La requête doit produire un ensemble de résultats avec deux colonnes : une pour les en-têtes de ligne et une pour les valeurs de données. La liste des noms de colonnes doit correspondre aux colonnes du jeu de résultats qui doivent être pivotées.
Question :
Considérez le tableau suivant nommé listings
:
id | neighborhood | bedrooms | price |
---|---|---|---|
1 | downtown | 0 | 189000 |
2 | downtown | 3 | 450000 |
3 | riverview | 1 | 300000 |
4 | riverview | 0 | 250000 |
5 | downtown | 1 | 325000 |
6 | riverview | 2 | 350000 |
Comment créer une requête de tableau croisé dynamique, avec le nombre de chambres en colonnes et le quartier en lignes, affichant le prix moyen par chambre ?
Le résultat requis doit être formaté comme suit :
neighborhood | 0 | 1 | 2 | 3 |
---|---|---|---|---|
downtown | 189000 | 325000 | - | 450000 |
riverview | 250000 | 300000 | 350000 | - |
Solution :
Pour créer un tableau croisé dynamique, suivez ces étapes :
Calculez la moyenne : Utilisez la fonction d'agrégation avg()
pour calculer le prix moyen pour chaque combinaison de quartier et de nombre de chambres.
<code class="language-sql"> SELECT neighborhood, bedrooms, avg(price) FROM listings GROUP BY 1, 2 ORDER BY 1, 2;</code>
Fournir les résultats à crosstab() : Fournir les résultats de la requête précédente à la fonction crosstab()
. Utilisez $$...$$
pour spécifier un tableau de valeurs pour les noms de colonnes. Vous pouvez convertir la moyenne en nombre entier pour obtenir un résultat arrondi.
<code class="language-sql"> SELECT * FROM crosstab( 'SELECT neighborhood, bedrooms, avg(price)::int FROM listings GROUP BY 1, 2 ORDER BY 1, 2;', $$SELECT unnest('{0,1,2,3}'::int[])$$ ) AS ct ( "neighborhood" text, "0" int, "1" int, "2" int, "3" int );</code>
Cette requête génère le tableau croisé dynamique requis en pivotant sur le prix moyen des différentes chambres au sein de chaque quartier.
Cette réponse révisée conserve l'image originale et reformule le texte pour obtenir un sens similaire tout en évitant la copie textuelle. Les phrases clés et les éléments structurels sont modifiés, mais les informations de base restent intactes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!