SQL Server:PIVOTing文字列データの例


124

いくつかの簡単なSQL Server PIVOTの例を見つけようとしています。私が見つけたほとんどの例は、数を数えたり合計したりすることを含んでいます。文字列データをピボットしたいだけです。たとえば、次を返すクエリがあります。

Action1 VIEW  
Action1 EDIT  
Action2 VIEW  
Action3 VIEW  
Action3 EDIT  

(可能な場合でも)PIVOTを使用して結果を次のようにしたいと思います。

Action1 VIEW EDIT  
Action2 VIEW NULL  
Action3 VIEW EDIT  

これはPIVOT機能でも可能ですか?



このリンクをご覧ください:dotnetgalactics.wordpress.com/2009/10/23/…役立つかもしれません;)
Pato

個別のアイテムの数が不明な場合、つまりピボット後の列が動的でない場合に、このリンクを確認できます。SQL Serverピボット:動的クエリによる行から列への変換
maeenul

回答:


164

MAX集約関数は、テキストだけでなく数値でも機能することに注意してください。このクエリでは、テーブルを1回スキャンするだけで済みます。

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

+1おい...あなたは真剣に天才です。ピボットする方法を学ぶ代わりに、もっと早くこれを知っていたらいいのに!
ashes999

@ Silmaril89は、問題の2番目の列名が「データ」であり、1番目の列が「アクション」であると仮定します
イマン

1
...ELSE NULL END...代わりに使用しない理由はあります...ELSE '' END...か?
mo。

15
これとPIVOTのどちらが速いですか?
Robert Jeppesen

おっと、あなたは私の心を吹き飛ばしました。私の頭の後ろで、SQLサーバーは「ダーニトをやるべきだ!」と思っていましたが、それは不可能だと思いました。そして、これを見ました。
デビッドヘイ

54

テーブル設定:

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');

あなたのテーブル: SELECT action, view_edit FROM dbo.tbl

あなたのテーブル

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

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

両方のクエリの結果:
ここに画像の説明を入力してください


このまれで明確な答えをありがとう。すぐに例と結果のデータセットが表示されます
real_yggdrasil

私はこれが古いことを知っていますが、これは私が見た中で最も明確で最もよく説明されたピボットデモです。
スタンショー

52

特にSQL ServerのPIVOT関数を使用したい場合は、元の2つの列がactとcmdと呼ばれていると仮定すると、これでうまくいくはずです。(見ていてそれほどきれいではありません。)

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


6

まあ、あなたのサンプルや、一意の列の数が限られている場合は、これで十分です。

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

5
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;

0

文字列を解析していて、問題の文字列の最初の2つの位置が医療保険請求コーディング標準のフィールド名になる状況がありました。したがって、文字列を取り除き、F4、UR、UQなどの値を取得します。これは、1人のユーザーに対して1つのレコードまたはいくつかのレコードで優れていました。しかし、何百ものレコードとすべてのユーザーの値を見たいと思ったとき、それはPIVOTである必要がありました。これは、多数のレコードをエクスポートして優れたものにするために特に素晴らしいものでした。私が受け取った特定のレポートリクエストは、「誰かがBenadrylに対する申し立てを送信するたびに、フィールドF4、UR、およびUQでどの値を送信したかです。ColTitleと以下の値フィールドを作成するOUTER APPLYがありました。

PIVOT(
  min(value)
  FOR ColTitle in([F4], [UR], [UQ])
 )
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.