- PR -

SQL文で教えてください

1
投稿者投稿内容
インスパ
大ベテラン
会議室デビュー日: 2002/08/30
投稿数: 125
投稿日時: 2009-02-04 22:45
以下のようなSQLを実現したいのですが、方法がわかりません。
わかる方がいらっしゃればご教授願います。
SQL SERVER2005です

テーブルが3つあります
販売実績2007、販売実績2008、顧客マスタ、顧客営業担当者マスタ

テーブルの項目は
販売実績2007、販売実績2008は同じレイアウトで「年月、売上額、顧客ID」の3つ
顧客マスタは「顧客ID、顧客名」の2つ
顧客営業担当者マスタは「顧客ID、担当者コード、担当者名」の3つ
実際のデータは以下のように入っているとします

販売実績2007
年月、売上額、顧客ID
200710、100、1
200711、200、1
200710、300、2

販売実績2008
年月、売上額、顧客ID
200810、500、1
200811、600、3

顧客マスタ
顧客ID、顧客名
1、顧客ABC
3、顧客XYZ

顧客営業担当者マスタ
顧客ID、担当者コード、担当者名
1、100、担当者A
1、200、担当者B
3、300、担当者C

これらのテーブルから、以下のように顧客別の売上額を出したいです
・顧客別に1行表示
・売上額は2007と2008で横に並べて合計値を出す
・顧客マスタに存在しないデータ(販売実績2007の3行目の顧客IDが2のレコード)も出したい
 顧客マスタは最新の顧客データしか持っていないため、販売実績とマッチしないデータがある
・顧客担当者マスタは顧客ごとに複数レコードあるが、顧客コードの値が小さい1件を表示する

顧客ID、顧客名、売上額2007、売上額2008、顧客担当者
1、顧客ABC、300、500、担当者A
2、、300、0、
3、顧客XYZ、0、600、担当者C

よろしくお願いします。
忠犬
大ベテラン
会議室デビュー日: 2006/05/01
投稿数: 109
投稿日時: 2009-02-05 00:12
自分で考えたSQLが未提示で、丸投げしている点には感心しませんが。。。

引用:

・顧客担当者マスタは顧客ごとに複数レコードあるが、顧客コードの値が小さい1件を表示



「顧客コード」でなく、「担当者コード」の値が小さい1件では?

SQL Server 2005とのことなので、SQL99の実装である「WITH句による共通表式」を使った例です。

コード:
with
 q1
  as
(
select
  顧客ID,
  sum(case when 年月 like '2007%' then 売上額
           else 0
      end) as 売上額2007,
  sum(case when 年月 like '2008%' then 売上額
           else 0
      end) as 売上額2008
 from(select
        *
       from 販売実績2007
      union
      select
        *
       from 販売実績2008
     ) as x
 group by 顧客ID
),
 q2
  as
(
select
  顧客ID,
  担当者コード,
  担当者名
 from 顧客営業担当者マスタ as y
 where 担当者コード=(select min(担当者コード)
                      from 顧客営業担当者マスタ
                      where 顧客ID=y.顧客ID)
)
select
  q1.顧客ID,
  cm.顧客名,
  q1.売上額2007,
  q1.売上額2008,
  q2.担当者名 as 顧客担当者
 from q1
  left join q2
   on q1.顧客ID=q2.顧客ID
  left join 顧客マスタ as cm
   on q1.顧客ID=cm.顧客ID
 order by q1.顧客ID




King
ぬし
会議室デビュー日: 2008/06/20
投稿数: 284
投稿日時: 2009-02-05 09:51
コード:

SELECT
    販売実績.顧客ID,
    顧客.顧客名,
    販売実績.売上額2007,
    販売実績.売上額2008,
    顧客担当.顧客担当者
FROM
(
    (
        SELECT
            顧客ID,
            SUM(売上額2007) AS 売上額2007,
            SUM(売上額2008) AS 売上額2008
        FROM
            (SELECT 顧客ID, 売上額 AS 売上額2007 , 0      AS 売上額2008 FROM 販売実績2007
             UNION
             SELECT 顧客ID, 0      AS 売上額2007 , 売上額 AS 売上額2008 FROM 販売実績2008) AS A
        GROUP BY
            顧客ID
    ) AS 販売実績
    LEFT OUTER JOIN 顧客マスタ 顧客 ON 顧客.顧客ID = 販売実績.顧客ID
    )
LEFT OUTER JOIN
(
    SELECT
        顧客ID,
        担当者名 AS 顧客担当者
    FROM
        (
        SELECT
            顧客ID,
            担当者コード,
            担当者名,
            MIN(担当者コード) OVER(PARTITION BY 顧客ID) AS MIN担当者コード
        FROM
            顧客営業担当者マスタ
        ) AS B
    WHERE
        担当者コード = MIN担当者コード
) AS 顧客担当 ON 顧客担当.顧客ID = 販売実績.顧客ID

インスパ
大ベテラン
会議室デビュー日: 2002/08/30
投稿数: 125
投稿日時: 2009-02-05 21:35
忠犬さんKingさんありがとうございます、ここまで書いてくださって感謝しています
これからこちらでどうできるか考えます。
1

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