Serveur SQL:Exemples de données de chaîne PIVOTing
-
09-06-2019 - |
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 ?
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
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 :
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;