Maison >base de données >tutoriel mysql >Comment puis-je effectuer une requête PIVOT sur des enregistrements distincts tout en préservant les associations et en gérant les valeurs nulles ?

Comment puis-je effectuer une requête PIVOT sur des enregistrements distincts tout en préservant les associations et en gérant les valeurs nulles ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-24 06:49:14474parcourir

How Can I Perform a PIVOT Query on Distinct Records While Preserving Associations and Handling Zero Values?

Requête PIVOT sur des enregistrements distincts avec association conservée

Considérez le scénario dans lequel nous avons un tableau avec des données contenant des activités et des pourcentages pour les individus. Une requête PIVOT standard utilisant la fonction MAX peut ignorer les activités avec des valeurs de pourcentage nulles. Pour résoudre ce problème, nous introduisons une solution qui préserve la relation entre les activités et les pourcentages.

Pour y parvenir, nous incorporons une fonction ROW_NUMBER() dans l'expression de table commune (CTE) pour ordonner séquentiellement les activités au sein de chaque groupe de noms. Avec cette technique, la requête PIVOT peut conserver l'association entre les activités et les pourcentages sur plusieurs lignes.

Voici un exemple de la requête révisée :

;with cte as 
(
    select *, ROW_NUMBER() over (partition by name order by percentage desc) ROWNUM
    from A
),
cte2 as
(
    SELECT Id,Code,ROWNUM,James,James_,Sam,Sam_,Lisa,Lisa_
    FROM cte
    PIVOT(MAX(activity)
          FOR name IN (James,Sam,Lisa)) AS PVTTable PIVOT
          (
          MAX(percentage)
          FOR name1 IN (James_,Sam_,Lisa_)) AS PVTTable1
)
select Id, Code, MAX(James) James, MAX(James_) James_, MAX(Sam) Sam, MAX(Sam_) Sam_, MAX(Lisa) Lisa, MAX(Lisa_) Lisa_
from cte2
group by Id, Code, ROWNUM

Le CTE, cte, ajoute un ROWNUM colonne au tableau initial, en classant les activités pour chaque nom par ordre décroissant de pourcentage. Cet ordre permet à la requête PIVOT suivante de regrouper et d'agréger correctement les données.

Le résultat de la requête ressemblera au résultat attendu, où des activités distinctes sont associées à leurs noms et pourcentages respectifs :

Id  Code        James       James_  Sam         Sam_    Lisa    Lisa_
1   Prashant    Running     43.43   Cooking 1   73      Walking 90.34
1   Prashant    Stealing    0.00    Cooking     3.43    NULL    NULL
1   Prashant    Lacking     0.00    NULL        NULL    NULL    NULL

Grâce à cette technique, nous pouvons obtenir des résultats PIVOT complets et précis tout en conservant l'association entre les activités et les pourcentages, même pour les enregistrements avec des valeurs de pourcentage nulles.

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