[解決済み] SQLで列と行を入れ替える簡単な方法?
質問
SQLで列と行を単純に入れ替えるにはどうしたらいいですか? 単純に入れ替えるコマンドはないのでしょうか?
このような結果になります。
Paul | John | Tim | Eric
Red 1 5 1 3
Green 8 4 3 5
Blue 2 2 9 1
をこの中に入れてください。
Red | Green | Blue
Paul 1 8 2
John 5 4 2
Tim 1 3 9
Eric 3 5 1
PIVOT
は、このシナリオには複雑すぎるようです。
どのように解決するのですか?
このデータを変換するには、いくつかの方法があります。最初の投稿で、あなたは次のように述べました。
PIVOT
はこのシナリオには複雑すぎるように思えますが、このような場合にも
UNPIVOT
と
PIVOT
関数を SQL Server で使用することができます。
しかし、これらの関数にアクセスできない場合は、以下の方法で再現できます。
UNION ALL
から
UNPIVOT
という集約関数があり
CASE
ステートメントを
PIVOT
:
テーブルを作成します。
CREATE TABLE yourTable([color] varchar(5), [Paul] int, [John] int, [Tim] int, [Eric] int);
INSERT INTO yourTable
([color], [Paul], [John], [Tim], [Eric])
VALUES
('Red', 1, 5, 1, 3),
('Green', 8, 4, 3, 5),
('Blue', 2, 2, 9, 1);
Union All、Aggregate、CASEバージョン。
select name,
sum(case when color = 'Red' then value else 0 end) Red,
sum(case when color = 'Green' then value else 0 end) Green,
sum(case when color = 'Blue' then value else 0 end) Blue
from
(
select color, Paul value, 'Paul' name
from yourTable
union all
select color, John value, 'John' name
from yourTable
union all
select color, Tim value, 'Tim' name
from yourTable
union all
select color, Eric value, 'Eric' name
from yourTable
) src
group by name
は
UNION ALL
が実行されます。
UNPIVOT
の列を変換することで、データの
Paul, John, Tim, Eric
を別々の行にする。そして、集計関数
sum()
を使用して
case
ステートメントを使用して、新しいカラムを各
color
.
UnpivotとPivot Staticバージョン。
どちらも
UNPIVOT
と
PIVOT
の関数を使うと、この変換が非常に簡単になります。 変換したい値がすべてわかっている場合は、静的バージョンにハードコードして結果を得ることができます。
select name, [Red], [Green], [Blue]
from
(
select color, name, value
from yourtable
unpivot
(
value for name in (Paul, John, Tim, Eric)
) unpiv
) src
pivot
(
sum(value)
for color in ([Red], [Green], [Blue])
) piv
内側のクエリに
UNPIVOT
と同じ働きをします。
UNION ALL
. これは、列のリストを受け取り、それを行に変換します。
PIVOT
で、最終的に列への変換を行う。
Dynamic Pivotバージョン。
列の数が不明な場合(
Paul, John, Tim, Eric
へのリストを生成するために動的SQLを使用することができます。
UNPIVOT
で、次に
PIVOT
:
DECLARE @colsUnpivot AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX),
@colsPivot as NVARCHAR(MAX)
select @colsUnpivot = stuff((select ','+quotename(C.name)
from sys.columns as C
where C.object_id = object_id('yourtable') and
C.name <> 'color'
for xml path('')), 1, 1, '')
select @colsPivot = STUFF((SELECT ','
+ quotename(color)
from yourtable t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'select name, '+@colsPivot+'
from
(
select color, name, value
from yourtable
unpivot
(
value for name in ('+@colsUnpivot+')
) unpiv
) src
pivot
(
sum(value)
for color in ('+@colsPivot+')
) piv'
exec(@query)
動的バージョンでは
yourtable
を指定し、次に
sys.columns
テーブルへのリストを生成するために
UNPIVOT
と
PIVOT
. これをクエリ文字列に追加して実行する。動的バージョンの利点は、変化する
colors
および
names
とすると、実行時にリストが生成されます。
3つのクエリはすべて同じ結果を生成します。
| NAME | RED | GREEN | BLUE |
-----------------------------
| Eric | 3 | 5 | 1 |
| John | 5 | 4 | 2 |
| Paul | 1 | 8 | 2 |
| Tim | 1 | 3 | 9 |
関連
-
[解決済み】Excelに合体的な関数はありますか?
-
[解決済み】Teradata - 計算中に数値のオーバーフローが発生しました。
-
[解決済み】sys.dm_exec_sql_textはどのように機能するのでしょうか?
-
[解決済み] PostgreSQL - json 型の等値演算子を識別できませんでした。
-
[解決済み] CLOBとNCLOBの違いは何ですか?
-
[解決済み] SQLiteでどのようにピボットするか、つまり、長い形式で保存されたテーブルを広い形式で選択するか?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server - 挿入された行のIDを取得するための最良の方法は?
-
[解決済み] SQLサーバーで行を列に効率的に変換する
-
[解決済み】複数カラムのSQL MAX?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】CREATE VIEW は、バッチ内の唯一のステートメントでなければなりません。
-
[解決済み】Postgresのエラー。式として使用されるサブクエリによって返される複数の行
-
[解決済み】一括読み込みデータ変換エラー(指定されたコードページに対して型の不一致または無効な文字)1行目4列目(年)について)
-
[解決済み】INTERSECTとINNER JOINは根本的に違うのか?[重複している]
-
[解決済み】SQL Serverは「集約関数やサブクエリを含む式に対して集約関数を実行できない」が、Sybaseはできる。
-
[解決済み] ORA-00920: 無効な関係演算子
-
[解決済み] ORA-00918: 列があいまいに定義されています」を解決する方法
-
[解決済み] SQLです。最初の出現箇所のみを返す
-
[解決済み] PostgreSQL - json 型の等値演算子を識別できませんでした。
-
[解決済み] SQLでchar値をmoneyに変換できない