Question

Essayer de trouver quelques exemples simples de SQL Server PIVOT.La plupart des exemples que j’ai trouvés impliquent de compter ou d’additionner des nombres.Je veux juste faire pivoter certaines données de chaîne.Par exemple, j'ai une requête qui renvoie ce qui suit.

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

J'aimerais utiliser PIVOT (si possible) pour obtenir les résultats suivants :

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

Est-ce même possible avec la fonctionnalité PIVOT ?

Était-ce utile?

La solution

N'oubliez pas que la fonction d'agrégation MAX fonctionnera aussi bien sur le texte que sur les chiffres.Cette requête ne nécessitera que la table soit analysée une seule fois.

SELECT Action,
       MAX( CASE data WHEN 'View' THEN data ELSE '' END ) ViewCol, 
       MAX( CASE data WHEN 'Edit' THEN data ELSE '' END ) EditCol
 FROM t
 GROUP BY Action

Autres conseils

Si vous souhaitez spécifiquement utiliser la fonction PIVOT de SQL Server, cela devrait fonctionner, en supposant que vos deux colonnes d'origine s'appellent act et cmd.(Ce n'est pas si joli à regarder cependant.)

SELECT act AS 'Action', [View] as 'View', [Edit] as 'Edit'
FROM (
    SELECT act, cmd FROM data
) AS src
PIVOT (
    MAX(cmd) FOR cmd IN ([View], [Edit])
) AS pvt

Configuration du tableau :

CREATE TABLE dbo.tbl (
    action VARCHAR(20) NOT NULL,
    view_edit VARCHAR(20) NOT NULL
);

INSERT INTO dbo.tbl (action, view_edit)
VALUES ('Action1', 'VIEW'),
       ('Action1', 'EDIT'),
       ('Action2', 'VIEW'),
       ('Action3', 'VIEW'),
       ('Action3', 'EDIT');

Ta table:SELECT action, view_edit FROM dbo.tbl

Your table

Requête sans utiliser PIVOT :

SELECT Action, 
[View] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'VIEW'),
[Edit] = (Select view_edit FROM tbl WHERE t.action = action and view_edit = 'EDIT')
FROM tbl t
GROUP BY Action

Requête à l'aide de PIVOT :

SELECT [Action], [View], [Edit] FROM
(SELECT [Action], view_edit FROM tbl) AS t1 
PIVOT (MAX(view_edit) FOR view_edit IN ([View], [Edit]) ) AS t2

Les deux requêtes donnent :
enter image description here

Depuis http://blog.sqlauthority.com/2008/06/07/sql-server-pivot-and-unpivot-table-examples/:

SELECT CUST, PRODUCT, QTY
FROM Product) up
PIVOT
( SUM(QTY) FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)) AS pvt) p
UNPIVOT
(QTY FOR PRODUCT IN (VEG, SODA, MILK, BEER, CHIPS)
) AS Unpvt
GO

Eh bien, pour votre échantillon et celui comportant un nombre limité de colonnes uniques, cela devrait le faire.

select 
    distinct a,
    (select distinct t2.b  from t t2  where t1.a=t2.a and t2.b='VIEW'),
    (select distinct t2.b from t t2  where t1.a=t2.a and t2.b='EDIT')
from t t1
With pivot_data as
(
select 
action, -- grouping column
view_edit -- spreading column
from tbl
)
select action, [view], [edit]
from   pivot_data
pivot  ( max(view_edit) for view_edit in ([view], [edit]) ) as p;

J'ai eu une situation où j'analysais des chaînes et les deux premières positions de la chaîne en question seraient les noms de champs d'une norme de codage des réclamations pour soins de santé.Je supprimerais donc les chaînes et obtiendrais des valeurs pour F4, UR et UQ ou autre.C'était génial sur un ou quelques enregistrements pour un utilisateur.Mais quand je voulais voir des centaines d'enregistrements et les valeurs de tous les utilisateurs, il fallait que ce soit un PIVOT.C'était merveilleux, surtout pour exporter de nombreux disques vers Excel.La demande de rapport spécifique que j'avais reçue était « chaque fois qu'une personne soumettait une réclamation pour Benadryl, quelle valeur soumettait-elle dans les champs F4, UR et UQ ».J'ai eu un OUTER APPLY qui a créé le ColTitle et les champs de valeur ci-dessous

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )

Vous pouvez l'utiliser avec le pivotement :

With pivot_data as
(
select 
action, -- grouping column
view_edit -- spreading column
from tbl
)
select action, [view], [edit]
from   pivot_data
pivot  ( max(view_edit) for view_edit in ([view], [edit]) ) as p;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top