- PR -

データの結合方法

1
投稿者投稿内容
ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-02-23 16:34
いつもお世話になります。
SQLサーバー2000(SP4)を使用しています。

以下のように2つのテーブルがあります。
在庫テーブル===========
材質 |長さ |在庫数
-----------------------
金属 |3.00 |10
金属 |3.50 | 5
金属 |4.00 | 2
木材 |3.00 | 5
木材 |3.50 | 2

販売テーブル===========
長さ |販売数
-----------------------
3.50 | 1
3.00 | 2
3.50 | 3
4.00 | 2
3.00 | 2
4.20 | 9

行ないたい処理は、
@在庫テーブルから長さ別に在庫数を集計する(材質は無関係)
→ SELECT 長さ,SUM(在庫数) FROM 在庫テーブル GROUP BY 長さ

長さ |在庫数
---------------
3.00 |15
3.50 | 7
4.00 | 2

A販売テーブルから長さ別の販売数量を集計する
→ SELECT 長さ,SUM(販売数) FROM 販売テーブル GROUP BY 長さ

販売テーブル===========
長さ |販売数
-----------------------
3.00 | 4
3.50 | 4
4.00 | 2
4.20 | 9

B@とAで得られたデータを結合して下記のように1つのデータとして抽出したい。

結果データ=============
長さ |販売数|在庫数
-----------------------
3.00 | 4  |12
3.50 | 4  | 7
4.00 | 2  | 2
4.20 | 9  | 0

この場合、在庫テーブルと販売テーブルから1回のSQL文実行でBのようなデータを抽出する事はできないのでしょうか?
私の思いつく方法だと@を実行し、その結果をどこかへ保存し、
その後Aを実行し、また結果をどこかへ保存し、
最終的に@とAをJOINするしか思い付きません。

どなたか良い方法がありましたらアドバイスをお願いします。
よっし〜。
ベテラン
会議室デビュー日: 2007/04/17
投稿数: 89
お住まい・勤務地: 北のほうの国
投稿日時: 2008-02-23 17:04
思いつきで。

コード:
SELECT 長さ,SUM(販売数)AS'販売数',SUM(在庫数)AS'在庫数' FROM (
(select 長さ,sum(販売数)as'販売数',0 AS '在庫数' from 販売 group by 長さ)
UNION
(select 長さ,0 AS '販売数',sum(在庫数)as'在庫数' from 在庫 group by 長さ)
)AS T GROUP BY 長さ


うーん美しくない。
もっとスマートな方法もありそう。

コード:
select z.長さ,sum(販売数)as'販売数',sum(在庫数)as'在庫数'
 from 在庫 z full outer join 販売 h on z.長さ=h.長さ
  group by z.長さ


できた。

この他さらに条件句をつける場合は注意が必要です。

なんでもかんでも1回のSQLで抽出するのもどうかと思いますね。
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2008-02-24 10:37
コード:
SELECT 長さ, 在庫数, 販売数
FROM (
  SELECT 長さ,SUM(在庫数) FROM 在庫テーブル GROUP BY 長さ
) A
JOIN (
  SELECT 長さ,SUM(販売数) FROM 販売テーブル GROUP BY 長さ 
) B
ON A.長さ = B.長さ
ORDER BY
  長さ


ってのは?
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2008-02-24 12:20
こんな感じでどうでしょう?

コード:
select
  coalesce(Z.長さ,H.長さ) as 長さ,
  coalesce(sum(在庫数),0) as 在庫数,
  coalesce(sum(販売数),0) as 販売数
 from 在庫t as Z
  full join 販売t as H
   on Z.長さ=H.長さ
 group by Z.長さ,H.長さ
 order by 1

ともこ
大ベテラン
会議室デビュー日: 2007/09/14
投稿数: 111
投稿日時: 2008-03-01 19:28
よっし〜。さん、かずくんさん、忠犬さん、レスありがとうございます。
それと返答が遅くなってしまいごめんなさい!

みなさん色々なテクニックをお持ちで、ほんと色々なSELECT文があるなぁ〜と驚かされます^^;参考にさせて頂きます。
「coalesce」って便利ですねー、これを知っておくと知らないのでは開発に大きく影響しますね!
ありがとうございました、
失礼します。
1

スキルアップ/キャリアアップ(JOB@IT)