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
Patricia Arquetteoriginal
2025-01-20 22:23:11404parcourir

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>

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>

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>

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>

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!

Déclaration:
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