重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

お世話になります。
SQL Serverのデータ加工についてSQLを教えてください。
元のデータをSQLを使って下記のほしいデータのようにして取得したいのです。
(出身地毎の行で各種目別に集計したい)
お願いします。

*元のデータ(MotoTable)
出身地,得点,種目,実施年,実施月
東京,80,幅跳び,2012,10
東京,54,反復横跳び,2012,10
長野,66,幅跳び,2012,10
新潟,47,幅跳び,2012,10
新潟,90,幅跳び,2012,10
佐賀,25,幅跳び,2012,10
佐賀,66,反復横跳び,2012,10
東京,100,幅跳び,2012,10
東京,19,反復横跳び,2012,10
愛知,5,懸垂,2012,10
愛知,6,懸垂,2012,10
佐賀,7,懸垂,2012,10


*欲しいデータ
出身地,合計点,幅跳び,反復横跳び,懸垂,実施年,実施月
東京,253,180,73,0,2012,10
長野,66,66,0,0,2012,10
新潟,137,137,0,0,2012,10
佐賀,98,25,66,7,2012,10
愛知,11,0,0,11,2012,10

A 回答 (2件)

select 出身地,sum(幅跳び),sum(反復横跳び),sum(懸垂),実施年,実施月


from (
select 出身地,得点 as 幅跳び,0 as 反復横跳び,0 as 懸垂,実施年,実施月 from MotoTable
where 種目 = '幅跳び'
union
select 出身地,0 as 幅跳び,得点 as 反復横跳び,0 as 懸垂,実施年,実施月 from MotoTable
where 種目 = '反復横跳び'
union
select 出身地,0 as 幅跳び,0 as 反復横跳び,得点 as 懸垂,実施年,実施月 from MotoTable
where 種目 = '懸垂'
)
group by 出身地,実施年,実施月
order by 出身地,実施年,実施月

とか、

select 出身地,
sum(case when 種目 = '幅跳び' then 得点 else 0 end) as 幅跳び,
sum(case when 種目 = '反復横跳び' then 得点 else 0 end) as 反復横跳び,
sum(case when 種目 = '懸垂' then 得点 else 0 end) as 懸垂,
実施年,実施月
from MotoTable
group by 出身地,実施年,実施月
order by 出身地,実施年,実施月

とか。

## 下のほうが早そうだが、キーの持ち方とかで一概にはいえない。
    • good
    • 0

PIVOT使うとか。

だめなら、Sum(case式)を使うとか。

SQL Serverのバージョンなどを補足したほうが回答を得られやすいと思います。
「データの加工SQL」の回答画像1
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す