SQLサーバー:PIVOTing 文字列データの例
-
09-06-2019 - |
質問
いくつかの簡単な SQL Server PIVOT の例を見つけようとしています。私が見つけた例のほとんどは、数字を数えたり合計したりすることに関係しています。文字列データをピボットしたいだけです。たとえば、次のようなクエリを返すとします。
Action1 VIEW
Action1 EDIT
Action2 VIEW
Action3 VIEW
Action3 EDIT
(可能であれば) PIVOT を使用して次のような結果を作りたいと考えています。
Action1 VIEW EDIT
Action2 VIEW NULL
Action3 VIEW EDIT
これはPIVOT機能でも可能ですか?
解決
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
他のヒント
特に 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
テーブルのセットアップ:
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
両方のクエリの結果は次のようになります。
から 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
そうですね、サンプルや固有の列の数が限られているサンプルの場合は、これで十分です。
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;
文字列を解析していて、問題の文字列の最初の 2 つの位置が医療請求コーディング標準のフィールド名になるという状況がありました。そこで、文字列を取り除いて、F4、UR、UQ などの値を取得します。これは、1 人のユーザーの 1 つのレコードまたはいくつかのレコードでは効果的でした。しかし、数百のレコードとすべてのユーザーの値を確認したい場合は、PIVOT である必要がありました。これは、特に大量のレコードを Excel にエクスポートする場合に素晴らしかったです。私が受け取った具体的な報告要求は、「誰かがベナドリルの請求を提出するたびに、フィールド F4、UR、および UQ にどのような値を提出したか。ColTitle と以下の値フィールドを作成する OUTER APPLY がありました。
PIVOT(
min(value)
FOR ColTitle in([F4], [UR], [UQ])
)
これをピボットとともに使用できます。
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;