Maison > base de données > tutoriel mysql > Comment générer dynamiquement des colonnes dans SQL pour l'analyse des données ?

Comment générer dynamiquement des colonnes dans SQL pour l'analyse des données ?

Susan Sarandon
Libérer: 2025-01-09 15:36:41
original
583 Les gens l'ont consulté

How to Dynamically Generate Columns in SQL for Data Analysis?

Créer dynamiquement des colonnes en SQL

La génération de colonnes dynamiques dans SQL permet de créer une structure de données flexible basée sur une entrée dynamique. Considérez le scénario suivant :

  • Customers le tableau contient les détails du client (ID et nom)
  • CustomerRewards le tableau contient les types de récompenses (TypeID et Description)
  • Rewardstableau reliant les clients et les récompenses

L'objectif est de créer dynamiquement des colonnes représentant les types de récompenses et de compter le nombre de récompenses client dans chaque type.

Pour ce faire, vous pouvez utiliser la fonction PIVOT de SQL :

SELECT
  name,
  [Bronze],
  [Silver],
  [Gold],
  [Platinum],
  [AnotherOne]
FROM
  (
    SELECT
      c.name,
      cr.description,
      r.typeid
    FROM
      customers AS c
    LEFT JOIN
      rewards AS r
      ON c.id = r.customerid
    LEFT JOIN
      customerrewards AS cr
      ON r.typeid = cr.typeid
  ) AS x
PIVOT
  (
    COUNT(typeid)
    FOR description IN ([Bronze], [Silver], [Gold], [Platinum], [AnotherOne])
  ) AS p;
Copier après la connexion

Ici, la fonction PIVOT convertit les lignes en colonnes en fonction des description champs, affichant les décomptes pour chaque type de récompense.

Pour un nombre inconnu de colonnes, vous pouvez utiliser du SQL dynamique :

DECLARE @cols AS NVARCHAR(MAX),
    @query AS NVARCHAR(MAX);

SELECT
  @cols = STUFF(
    (
      SELECT
        ',' + QUOTENAME(description)
      FROM
        customerrewards
      GROUP BY
        description,
        typeid
      ORDER BY
        typeid
      FOR XML PATH(''),
      TYPE
    ).value('.', 'NVARCHAR(MAX)'),
    1,
    1,
    ''
  );

SET
  @query = 'SELECT name, ' + @cols + ' FROM 
             (
                SELECT
                  c.name,
                  cr.description,
                  r.typeid
                FROM
                  customers AS c
                LEFT JOIN
                  rewards AS r
                  ON c.id = r.customerid
                LEFT JOIN
                  customerrewards AS cr
                  ON r.typeid = cr.typeid
            ) AS x
            PIVOT 
            (
                COUNT(typeid)
                FOR description IN (' + @cols + ')
            ) AS p ';

EXECUTE (@query);
Copier après la connexion

Les requêtes dynamiques créent des colonnes basées sur les valeurs de la table customerrewards.

Pour inclure la colonne "Total", vous pouvez utiliser l'opérateur ROLLUP :

SELECT
  name,
  SUM([Bronze]) AS Bronze,
  SUM([Silver]) AS Silver,
  SUM([Gold]) AS Gold,
  SUM([Platinum]) AS Platinum,
  SUM([AnotherOne]) AS AnotherOne
FROM
  (
    SELECT
      name,
      [Bronze],
      [Silver],
      [Gold],
      [Platinum],
      [AnotherOne]
    FROM
      (
        SELECT
          c.name,
          cr.description,
          r.typeid
        FROM
          customers AS c
        LEFT JOIN
          rewards AS r
          ON c.id = r.customerid
        LEFT JOIN
          customerrewards AS cr
          ON r.typeid = cr.typeid
      ) AS x
      PIVOT
      (
        COUNT(typeid)
        FOR description IN ([Bronze], [Silver], [Gold], [Platinum], [AnotherOne])
      ) AS p
  ) AS x1
GROUP BY
  name
WITH ROLLUP;
Copier après la connexion

En générant dynamiquement des colonnes, vous pouvez gérer efficacement les structures de données changeantes et présenter les données de manière complète.

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 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