? Dans SQL , un tableau croisé dynamique est un ensemble de données qui est transformé à partir d' une collection de lignes séparées pour une collection de colonnes . Dans les bases de données relationnelles telles que Microsoft SQL Server, Oracle et MySQL, les tableaux croisés dynamiques peuvent être utilisés pour simplifier les données importantes afin de le rendre plus facile à lire et à comprendre. Pour créer une table de pivotement , un agrégat est utilisé contre un ensemble de données pour distribuer des rangées multiples d'une même colonne dans une rangée unique avec plusieurs colonnes . Cette essentiellement pivots le résultat mis de côté . Données-échantillon
pour mieux comprendre un tableau croisé dynamique , un exemple de certaines données de ventes sont listés ici. Copiez le texte suivant dans Microsoft SQL Server Management Studio pour essayer les exemples .
CREATE TABLE # PivotTestTable ( NomCli varchar ( 8) , ITEM_TYPE varchar ( 8) , Item_Amount numérique ( 6,2 ) )
< p> insert into # PivotTestTableselect « Jason », « informatique », 435.34unionselect ' Jason ', ' Software' , 243.54unionselect ' Jason' , 'Monitor', 158.23unionselect ' Alison ', ' travail' , 345.89unionselect « Alison », «Logiciels» , 78.78unionselect ' Alison ', ' Monitor', 123,45
partir des données non pivotée
Lorsque la table temporaire # PivotTestTable , est interrogé , le résultat est ce qui suit .
NomCli ITEM_TYPE Item_Amount -------- -------------------- Alison Computer 345.89Alison Moniteur 123.45Alison Software 78.78Jason Computer 435.34Jason Moniteur 158.23Jason Software 243.54
Comme vous pouvez le voir, l'ensemble des résultats montre deux clients , Alison et Jason , qui ont acheté trois types différents d' articles . Il ya six lignes de données pour deux clients . Si nous voulions voir les données dans une seule ligne par client , nous devrions utiliser un tableau croisé dynamique pour atteindre le résultat souhaité.
Pivot par PIVOT fonction
Microsoft SQL Server dispose d' une fonction de pivot intégré dans SQL Server. Voici un exemple avec les données # PivotTestTable .
SELECTCustName comme Total_Sales_By_Cust , ordinateur, moniteur, SoftwareFROM ( SELECTCustName , ITEM_TYPE , Item_AmountFROM # PivotTestTable ) aPIVOT (somme ( Item_Amount ) POUR ITEM_TYPE dans (ordinateur, écran , logiciels ) ) b
Cette requête va renvoyer les six lignes d'origine pivoté dans deux rangées de colonnes distinctes pour chaque type de produit vendu. Le jeu de résultats générés par cette requête est ici:
Total_Sales_By_Cust moniteur Logiciels ------------------- ----------- --------------- Alison 345.89 123.45 435.34 158.23 243.54 78.78Jason
Pivot par agrégé Argumentaire
en utilisant un agrégat fonction (SUM , AVG , MIN, MAX) autour d'une déclaration de cas dans une requête SQL , nous sommes en mesure d'atteindre le même résultat que la fonction de pivot avec moins de travail.
SELECTCustName comme Total_Sales_By_Cust , la somme ( cas lorsque ITEM_TYPE «ordinateur» puis de fin Item_Amount ) en informatique , la somme ( cas ITEM_TYPE quand puis fin Item_Amount 'Monitor' ) en tant que moniteur , la somme ( cas ITEM_TYPE lorsque «logiciel» puis fin Item_Amount ) comme SoftwareFROM # PivotTestTableGROUP PAR NomCli
requête renverra le même résultat exact ensemble de l'exemple précédent et est seulement une préférence pour le type de pivot à utiliser.
erreur commune avec des tableaux croisés dynamiques
commune erreur de créer un tableau croisé dynamique est de créer une jointure sur la table source. Ceci va produire des résultats peu fiables et doivent être évités . Cet exemple est strictement un exemple de quoi ne pas faire . Le résultat de cet exemple sera le même , mais cet exemple ne fonctionne pas dans tous les cas
SELECTp1.CustName , p1.Item_Amount en informatique , p2.Item_Amount comme moniteur , p3.Item_Amount comme SoftwareFROM p1INNER # PivotTestTable . REJOIGNEZ p1.CustName de p2on # PivotTestTable = p2.CustNameand p2.Item_Type = ' Monitor'INNER INSCRIPTION p1.CustName de p3on # PivotTestTable = p3.CustNameand p3.Item_Type =' Software'WHERE p1.Item_Type = ' Computer '
< br >