Éviter la perte de données dans les requêtes PIVOT pour des enregistrements distincts
Problème :
Les requêtes PIVOT sont utiles pour la restructuration données pour afficher les informations de manière plus organisée. Cependant, lorsqu'il s'agit d'enregistrements distincts, la fonction d'agrégation MAX peut entraîner l'omission de valeurs nulles, conduisant à des données incomplètes.
Solution :
Pour conserver tous les enregistrements distincts, même ceux avec des valeurs nulles, on peut incorporer la fonction ROW_NUMBER() dans la requête PIVOT. Cette approche attribue un numéro de ligne à chaque enregistrement, en conservant l'association entre les activités et les pourcentages.
;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
Exemple :
Considérez le tableau suivant :
Id | Code | percentage | name | name1 | activity |
---|---|---|---|---|---|
1 | Prashant | 43.43 | James | James_ | Running |
1 | Prashant | 70.43 | Sam | Sam_ | Cooking |
1 | Prashant | 90.34 | Lisa | Lisa_ | Walking |
1 | Prashant | 0.00 | James | James_ | Stealing |
1 | Prashant | 0.00 | James | James_ | Lacking |
1 | Prashant | 73 | Sam | Sam_ | Cooking 1 |
Auparavant, une requête PIVOT standard aurait produit ce qui suit résultat :
Id | Code | James | James_ | Sam | Sam_ | Lisa | Lisa_ |
---|---|---|---|---|---|---|---|
1 | Prashant | Running | 43.43 | Cooking 1 | 73 | Walking | 90.34 |
1 | Prashant | Stealing | 0.0 | Cooking | 3.43 | NULL | NULL |
1 | Prashant | NULL | NULL | NULL | NULL | NULL | NULL |
Cependant, en incorporant la fonction ROW_NUMBER(), la requête modifiée conserve tous les enregistrements distincts :
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 |
Cette approche garantit que toutes les activités distinctes sont affichées, même celles avec des valeurs de pourcentage nulles, fournissant une représentation plus précise des données.
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!