問題

SalesData:売上データ
(district_nbr:地区番号, sales_person:セールスマン, sales_id:セールスID, sales_amt:売上高)

「各地域で上位3位の好成績を上げたセールスマンのレポートを作成する」
サンプルデータ:
  district_nbr |  sales_person   | sales_id | sales_amt
 --------------+-----------------+----------+-----------
             1 | カーリー        |        5 |      3.00
             1 | ハーポ          |       11 |      4.00
             1 | ラリー          |        1 |     50.00
             1 | ラリー          |        2 |     50.00
             1 | ラリー          |        3 |     50.00
             1 | モー            |        4 |      5.00
             2 | ディック        |        8 |      5.00
             2 | フレッド        |        7 |      5.00
             2 | ハリー          |        6 |      5.00
             2 | トム            |        7 |      5.00
             3 | アーヴィン      |       10 |      5.00
             3 | メルヴィン      |        9 |      7.00
             4 | ジェニー        |       15 |     20.00
             4 | ジェシー        |       16 |     10.00
             4 | メアリー        |       12 |     50.00
             4 | オプラ          |       14 |     30.00
             4 | サリー          |       13 |     40.00

yukaさんの回答


fumikoの回答

SQL文

 CREATE VIEW ss (district_nbr,sales_person,sum_sales_amt) AS 
 SELECT district_nbr,sales_person,sum(sales_amt)as sum_sales_amt
 FROM salesdata
 GROUP BY sales_person,district_nbr
 ORDER BY district_nbr ,sum_sales_amt desc

 CREATE VIEW ss2 (district_nbr,sales_person,sum_sales_amt) AS
 SELECT  s1.district_nbr,
         s1.sales_person,
      (SELECT (case when count(s2.sum_sales_amt) = 0 then s1.sum_sales_amt 
                    when count(s2.sum_sales_amt) = 1 then s1.sum_sales_amt 
                    when count(s2.sum_sales_amt) = 2 then s1.sum_sales_amt 
                    else null end)
       FROM ss as s2
       WHERE s1.sum_sales_amt < s2.sum_sales_amt 
                and s1.district_nbr = s2.district_nbr) as sum_sales_amt
 FROM ss as s1
 GROUP BY s1.district_nbr,s1.sales_person,s1.sum_sales_amt
 ORDER BY s1.district_nbr,s1.sum_sales_amt desc) as ss2
 

 SELECT district_nbr,sales_person,sum_sales_amt
 FROM ss2
 WHERE sum_sales_amt IS NOT NULL

結果

  district_nbr |  sales_person   | sum_sales_amt
 --------------+-----------------+---------------
             1 | ラリー          |        150.00
             1 | モー            |          5.00
             1 | ハーポ          |          4.00
             2 | ハリー          |          5.00
             2 | フレッド        |          5.00
             2 | ディック        |          5.00
             2 | トム            |          5.00
             3 | メルヴィン      |          7.00
             3 | アーヴィン      |          5.00
             4 | メアリー        |         50.00
             4 | サリー          |         40.00
             4 | オプラ          |         30.00

考え

  • ビュー作成:personごとに売上合計を集計したテーブル
  district_nbr |  sales_person   | sum_sales_amt
 --------------+-----------------+---------------
             1 | ラリー          |        150.00
             1 | カーリー        |          3.00
             1 | ハーポ          |          4.00
             1 | モー            |          5.00
             2 | フレッド        |          5.00
             2 | トム            |          5.00
             2 | ディック        |          5.00
             2 | ハリー          |          5.00
             3 | アーヴィン      |          5.00
             3 | メルヴィン      |          7.00
             4 | サリー          |         40.00
             4 | オプラ          |         30.00
             4 | ジェニー        |         20.00
             4 | ジェシー        |         10.00
             4 | メアリー        |         50.00

  • 相関副問い合わせ&自己結合
    • 自己結合:売上合計が一方より大きく、地区番号が等しいという条件で
    例:地区番号1の場合
   sales_person   | sum_sales_amt |  sales_person   | sum_sales_amt
 -----------------+---------------+-----------------+---------------
  ハーポ          |          4.00 | ラリー          |        150.00
  ハーポ          |          4.00 | モー            |          5.00
  カーリー        |          3.00 | ハーポ          |          4.00
  カーリー        |          3.00 | ラリー          |        150.00
  カーリー        |          3.00 | モー            |          5.00
  モー            |          5.00 | ラリー          |        150.00

  • 地区番号、セールスマンごとにグループ化しする
  • count(s2.sales_person)が0~2の場合は上位三位である
最終更新:2008年05月01日 11:00