Maison > base de données > tutoriel mysql > Comment effectuer efficacement une requête croisée en SQL ?

Comment effectuer efficacement une requête croisée en SQL ?

Patricia Arquette
Libérer: 2025-01-20 22:23:11
original
364 Les gens l'ont consulté

How to Efficiently Perform a Crosstab Query in SQL?

Utilisez CASE et GROUP BY pour remplacer dynamiquement PIVOT

Question :

Les données présentées dans le tableau ci-dessous sont organisées en lignes et en colonnes. L'objectif est de convertir cela en un tableau avec un nombre dynamique de colonnes, où chaque colonne représente une valeur regroupée par une catégorie spécifiée.

id feh bar
1 10 A
2 20 A
3 3 B
4 4 B
5 5 C
6 6 D
7 7 D
8 8 D

Résultat attendu :

bar val1 val2 val3
A 10 20
B 3 4
C 5
D 6 7 8

Requête originale :

La requête suivante utilise les expressions CASE et GROUP BY pour obtenir les résultats souhaités :

<code class="language-sql">SELECT bar, 
MAX(CASE WHEN abc."row" = 1 THEN feh ELSE NULL END) AS "val1",
MAX(CASE WHEN abc."row" = 2 THEN feh ELSE NULL END) AS "val2",
MAX(CASE WHEN abc."row" = 3 THEN feh ELSE NULL END) AS "val3"
FROM
(
  SELECT bar, feh, row_number() OVER (partition by bar) as row
  FROM "Foo"
 ) abc
GROUP BY bar </code>
Copier après la connexion

Alternative efficace au tableau croisé :

Pour améliorer l'efficacité et la lisibilité, vous pouvez utiliser la fonction crosstab du module tablefunc pour implémenter une solution dynamique. Voici un exemple :

<code class="language-sql">SELECT * FROM crosstab(
  'SELECT bar, 1 AS cat, feh
   FROM tbl_org
   ORDER BY bar, feh')
 AS ct (bar text, val1 int, val2 int, val3 int);  -- 更多列?</code>
Copier après la connexion

Gestion de plusieurs valeurs :

Pour les scénarios où il y a plusieurs valeurs sous la même catégorie, la fonction de tableau croisé peut être étendue sous la forme suivante :

<code class="language-sql">SELECT * FROM crosstab(
  'SELECT bar, val, feh
   FROM tbl_org
   ORDER BY 1, 2')
 AS ct (bar text, val1 int, val2 int, val3 int);  -- 更多列?</code>
Copier après la connexion

Fonction de tableau croisé intégrée :

Le module tablefunc fournit également des fonctions de tableau croisé prédéfinies pour un nombre spécifique de colonnes :

<code class="language-sql">SELECT * FROM crosstab3('SELECT row_name, attrib, val FROM tbl ORDER BY 1,2');</code>
Copier après la connexion

Ces fonctions simplifient les appels et gèrent les données texte par défaut.

Type de retour dynamique :

Bien que tablefunc simplifie le processus, il présente des limites dans la gestion des types de retour dynamiques. Pour résoudre ce problème, d'autres méthodes peuvent être envisagées, comme l'utilisation de fonctions PL/pgSQL ou la création d'instructions SQL dynamiques.

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal