質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

2回答

518閲覧

SQLServerでUNIONしたテーブルに同じ項目がある場合に一部の項目の値を変更する方法

ranma

総合スコア5

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2017/11/26 09:13

###前提・実現したいこと
テーブルA
NAME SUBJECT SCORE
太郎  英語   30   
次郎  英語   40
三郎  英語   50

テーブルB
NAME SUBJECT SCORE
太郎  数学   40
次郎  数学   50
四郎  数学   60

SQLServerで上記のような2つのテーブルをunion allし、同じNAME項目があれば
列に合計を表示するような取得方法はありますでしょうか?

実現したい検索結果
NAME SUBJECT SCORE
太郎  英語   70
太郎  数学   70
次郎  英語   90
次郎  数学   90
三郎  英語   50
四郎  数学   60

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

SQLServerの分析関数の使用例
https://oraclesqlpuzzle.ninja-web.net/sqlserver2008-sql1-olap.html
を見ながら、SQLFiddleのSQLServer2014環境で作ってみました :-)

sql

1with A(NAME,SUBJECT,SCORE) as( 2select N'太郎',N'英語',30 union 3select N'次郎',N'英語',40 union 4select N'三郎',N'英語',50), 5B(NAME,SUBJECT,SCORE) as( 6select N'太郎',N'数学',40 union 7select N'次郎',N'数学',50 union 8select N'四郎',N'数学',60), 9tmp as( 10select NAME,SUBJECT,SCORE from A 11union all 12select NAME,SUBJECT,SCORE from B) 13select NAME,SUBJECT,sum(SCORE) over(partition by NAME) as SCORE 14 from tmp 15order by NAME,SUBJECT; 16 17| NAME | SUBJECT | SCORE | 18|--------|---------|-------| 19| 三郎 | 英語 | 50 | 20| 四郎 | 数学 | 60 | 21| 太郎 | 数学 | 70 | 22| 太郎 | 英語 | 70 | 23| 次郎 | 数学 | 90 | 24| 次郎 | 英語 | 90 |

投稿2017/11/26 09:52

編集2019/03/12 06:33
AketiJyuuzou

総合スコア1147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2017/11/26 16:02

partition byにSUBJECTが足らないですね
ranma

2017/11/29 14:05

解決しました。感謝します。
guest

0

なぜ、union してた結果をgroup by してsum()を取るのが駄目なのか分かりませんが、
そこは不問にするとしての回答です。

union した結果で重複して2つまでという前提で。( 2012以降)

SQL

1select NAME,SUBJECT 2 , SCORE 3 +LEAD(SCORE,1,0) over(partition by NAME,SUBJECT order by SCORE) 4 +LAG(SCORE,1,0) over(partition by NAME,SUBJECT order by SCORE) 5 as SCORE 6from ( 7 select * from テーブルA 8 union all 9 select * from テーブルB 10) t1

3以上重複というなら(2008以降) 

SQL

1with テーブルAB(NAME,SUBJECT,SCORE) as( 2 select * from テーブルA 3 union all 4 select * from テーブルB 5) 6select NAME,SUBJECT 7 , (select sum(SCORE) from テーブルAB 8 where NAME=t1.NAME and SUBJECT=t1.SUBJECT) as SCORE 9from テーブルAB as t1

※一応、AketiJyuuzouさんの別解ということで、使用できる環境なら、AketiJyuuzouさんの方が性能面で良いと思います。

投稿2017/11/26 11:57

編集2017/11/26 16:05
sazi

総合スコア25188

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ranma

2017/11/29 14:06

回答ありがとうございます。感謝します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問