こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

SQLの質問です。

SQLの質問です。
SQL Server 2008 R2 を使っている初心者です。

下の2つのテーブルがあります。

1)売上情報 table_uriage
・uriage_id
・user_id
・uriage_date
・uriage_kingaku

2)入金情報 table_nyukin
・nyukin_id
・user_id
・nyukin_date
・nyukin_kingaku


この2つのテーブルに対して、同じ期間を指定して、集計表(ユーザー毎の合計)を
作りたいと思っています。別々の表にするには何の問題もないのですが、
問題は2つのSQLの結果を1つの表にしたいのですが、SQLをどのように組んだらいいか
わかりません。

具体的な表としては、

user_id uriage_total nyukin_total
========================================
001 11111 22222
002 33333 44444
003 55555 66666

みたいな感じになればいいのです。


どなたか教えて下さい。
よろしくお願いいたします。

投稿日時 - 2010-06-27 17:31:48

QNo.5999281

困ってます

このQ&Aは役に立ちましたか?

24人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

ちょっと噛み合ってないような気がするので。。

>また、入金の数値が、本来の数値の7倍,8倍となって出力されます。

JOINの対象となっているキーが両方とも主キーではないので、当然ながらそうなります。
一旦それぞれのテーブルを集計してから結合するか、UNIONを使うのが一般的だろうと思います。

○一旦集計してからFULL OUTER JOINする
select
isnull(u.user_id,n.user_id) user_id,
isnull(u.uriage_total,0) uriage_total,
isnull(n.nyukin_total,0) nyukin_total
from
(select user_id,sum(uriage_kingaku) uriage_total
from table_uriage
group by user_id) u
full outer join
(select user_id,sum(nyukin_kingaku) nyukin_total
from table_nyukin
group by user_id) n
on u.user_id = n.user_id

○UNIONしてから集計する
select
user_id,
isnull(sum(uriage_kingaku),0) uriage_total,
isnull(sum(nyukin_kingaku),0) nyukin_total
from (
select user_id,uriage_kingaku,0 nyukin_kingaku
from table_uriage
union all
select user_id,0,nyukin_kingaku
from table_nyukin) tmp
group by user_id

投稿日時 - 2010-06-28 17:39:33

ANo.2

♯1です。

>売上がないと、入金があっても一覧に表示されません。
>売上と入金のどちらかがあれば出力したいと考えています。

その場合は、完全外部結合を使ってこうなります。

select
u.user_id,
sum(u.uriage_kingaku) uriage_total,
sum(n.nyukin_kingaku) nyukin_total
from table_uriage u
full outer join
table_nyukin n
on u.user_id = n.user_id
group by u.user_id

>また、入金の数値が、本来の数値の7倍,8倍となって出力されます。

uriage_total、nyukin_totalなのでSUMでサマリしているのですが、その値が想定される値と異なる、と言う事でしょうか?
(もし、そうなら可能な範囲でデータ内容を提示してください)

そうではなくて、uriage_kingakuとnyukin_kingakuには既にサマッた値が入っている、と言う事であれば、単純にサマリをやめればよいだけです。
(トランザクションデータの有りようとしては微妙ですが。。。)

select
u.user_id,
u.uriage_kingaku uriage_total,
n.nyukin_kingaku nyukin_total
from table_uriage u
full outer join
table_nyukin n
on u.user_id = n.user_id

投稿日時 - 2010-06-28 13:45:10

ANo.1

ごく普通の結合条件+集計なのでこんな感じです。

select
u.user_id,
sum(u.uriage_kingaku) uriage_total,
sum(n.nyukin_kingaku) nyukin_total
from table_uriage u
inner join
table_nyukin n
on u.user_id = n.user_id
group by u.user_id

ただし、売上と入金のデータがINSERTされるタイムラグが考えられるので、「売上が先にできる」と言う前提で書くと、外部結合を使ってこうなります。

select
u.user_id,
sum(u.uriage_kingaku) uriage_total,
sum(n.nyukin_kingaku) nyukin_total
from table_uriage u
left join
table_nyukin n
on u.user_id = n.user_id
group by u.user_id

※MSSQL手元にないので未検証

投稿日時 - 2010-06-27 19:51:26

お礼

早速の回答、ありがとうございました。
「inner join」を使ったやり方ですと、売上と入金の両方がないと一覧に出てきませんでした。

「left join」を使ったやり方ですと、売上があって、入金がなかったものは「NULL」として出てくるのですが、
売上がないと、入金があっても一覧に表示されません。
売上と入金のどちらかがあれば出力したいと考えています。

また、入金の数値が、本来の数値の7倍,8倍となって出力されます。
どうしてなんでしょうか。

この辺のところご指導下さい。

投稿日時 - 2010-06-28 08:41:43

あなたにオススメの質問