[解決済み] SQL Serverで複数行を複数列に動的に結合する
2022-03-07 14:51:43
質問
私は、Microsoft SQL Serverを使用して、以下のアクションを動的に実行する必要がある大規模なデータベーステーブルを持っています。
このような結果から
badge | name | Job | KDA | Match
- - - - - - - - - - - - - - - -
T996 | Darrien | AP | 3.0 | 20
T996 | Darrien | ADC | 2.8 | 16
T996 | Darrien | TOP | 5.0 | 120
SQLを使ってこのような結果に。
badge | name | AP_KDA | AP_Match | ADC_KDA | ADC_Match | TOP_KDA | TOP_Match
- - - - - - - - -
T996 | Darrien | 3.0 | 20 | 2.8 | 16 | 5.0 | 120
30行あっても、60列で1行にまとまります。
現在、ハードコーディングではできるのですが(下記の例参照)、ダイナミックにはできません。
Select badge,name,
(
SELECT max(KDA)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'AP')
) AP_KDA,
(
SELECT max(Match)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'AP')
) AP_Match,
(
SELECT max(KDA)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'ADC')
) ADC_KDA,
(
SELECT max(Match)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'ADC')
) ADC_Match,
(
SELECT max(KDA)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'TOP')
) TOP_KDA,
(
SELECT max(Match)
FROM table
WHERE (h.badge = badge) AND (h.name = name)
AND (Job = 'TOP')
) TOP_Match
from table h
複数の行を1つの行にまとめることができるMSSQLステートメントが必要です。3列目(
Job
) のコンテンツは、カラム 4 と 5 のヘッダー (
KDA
と
Match
) となり、新しいカラムになります。
で6つの異なる値がある場合
Job
(例えば
Job1
を通して
Job6
) の場合、結果は12カラムになります、例.
Job1_KDA
,
Job1_Match
,
Job2_KDA
,
Job2_Match
などを、バッジと名前ごとにグループ化したものです。
列3のデータをループするステートメントが必要で、ハードコードする必要はありません(可能性のある各列に対してクエリを繰り返す)。
Job
を使用するか、テンポラリテーブルを使用します。
どのように解決するのですか?
動的SQLを使ってやるのですが、これでは( http://sqlfiddle.com/#!6/a63a6/1/0 ) PIVOTソリューションです。
SELECT badge, name, [AP_KDa], [AP_Match], [ADC_KDA],[ADC_Match],[TOP_KDA],[TOP_Match] FROM
(
SELECT badge, name, col, val FROM(
SELECT *, Job+'_KDA' as Col, KDA as Val FROM @T
UNION
SELECT *, Job+'_Match' as Col,Match as Val FROM @T
) t
) tt
PIVOT ( max(val) for Col in ([AP_KDa], [AP_Match], [ADC_KDA],[ADC_Match],[TOP_KDA],[TOP_Match]) ) AS pvt
おまけ:PIVOTをダイナミックSQLと組み合わせる方法です( http://sqlfiddle.com/#!6/a63a6/7/0 しかし、これは私にとっては良い練習になりました。
SELECT badge, name, cast(Job+'_KDA' as nvarchar(128)) as Col, KDA as Val INTO #Temp1 FROM Temp
INSERT INTO #Temp1 SELECT badge, name, Job+'_Match' as Col, Match as Val FROM Temp
DECLARE @columns nvarchar(max)
SELECT @columns = COALESCE(@columns + ', ', '') + Col FROM #Temp1 GROUP BY Col
DECLARE @sql nvarchar(max) = 'SELECT badge, name, '+@columns+' FROM #Temp1 PIVOT ( max(val) for Col in ('+@columns+') ) AS pvt'
exec (@sql)
DROP TABLE #Temp1
関連
-
[解決済み] SQL ServerでSELECTからUPDATEする方法とは?
-
[解決済み] SQL Server で複数行のテキストを 1 つのテキスト文字列に連結する方法
-
[解決済み] SQL Server の DateTime データ型から日付だけを返す方法
-
[解決済み] SQL ServerにおけるLEFT JOINとLEFT OUTER JOINの比較
-
[解決済み] MySQLの複数行を1つのフィールドに連結することはできますか?
-
[解決済み] 複数の列でgroup byを使用する
-
[解決済み] 最初の行への結合方法
-
[解決済み] SQL Server テーブルからランダムな n 行を選択する
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み] SQL ServerでINNER JOINを使用して削除するにはどうすればよいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] テーブルのFROM句の項目がない [終了しました] 。
-
[解決済み】ストアドプロシージャーのエラー ORA-06550
-
[解決済み】2つの列を分割する方法は?
-
[解決済み】SQLクエリ「00904. 00000 - "%s: 無効な識別子"
-
[解決済み】SQLが単一グループのグループ関数でないこと
-
[解決済み】単一のクエリで加重平均を計算する
-
[解決済み】一括読み込みデータ変換エラー(切り捨て)
-
[解決済み】SQL Serverは「集約関数やサブクエリを含む式に対して集約関数を実行できない」が、Sybaseはできる。
-
[解決済み] varchar 値の変換で int カラムがオーバーフローしました。
-
[解決済み] SQLiteでどのようにピボットするか、つまり、長い形式で保存されたテーブルを広い形式で選択するか?