1

各テリトリー (TERR) には複数のセールスマン (SALM) がいる場合がありますが、各セールスマンは 1 つのテリトリーしか持つことができません。

例:

Territory      Salesman   Sales$ Period   
    1             100      999     1
    1             100      999     2
    1             200      999     1 
    1             200      999     2    
    2             300      999     1
    2             300      999     2
    3             400      999     1
    3             400      999     2

できれば単一の SQL ステートメントを使用して、集計テーブルを作成したいと思います-

  • 領土を示し、
  • この地域のセールスマンの数 (** 明確化: ** これは、この地域で売上を上げた一意のセールスマン コードの合計です) および
  • 同じファイルにセールスマン番号をリストします。

例:

Territory # of Salesmen   Salesman   
--------- -------------   --------   
1             2            100       
1             2            200       
2             1            300       
3             1            400       

SQL:

// First I get a list of territories and number of salesman in each territory
With tmpFile as (Select TERR, SALM, count(*) 
   FROM FILE
   GROUP BY TERR, SALM 
   ORDER BY TERR, SALM   
) 
SELECT tmpFile.TERR, count(*) FROM tmpFile GROUP BY          
tmpFile.TERR ORDER BY tmpFile.TERR

// Next step is to get a list of all salesmen in a territory
Select TERR, SALM
   FROM FILE
   GROUP BY TERR, SALM 
   ORDER BY TERR, SALM
) 

// 最後のステップは、上記の 2 つのステップを結合することです。可能であれば、3 つのステップすべてを 1 つのステートメントにまとめたいと思います。これを行うためのより効果的な方法はありますか。IBM db/2 SQL を使用しています。

4

3 に答える 3

0

一般的なテーブル式 [aka. WITH 句] ですが、1 つのステートメントで簡単かつ効率的に実行できます。

WITH t as
(SELECT terr, count(distinct salm) as slspeople
   FROM yourfile
   WHERE salesamt > 0
   GROUP BY terr
)
SELECT DISTINCT s.terr, t.slspeople, s.salm
  FROM yourfile as s
  JOIN    t       using (terr)
  WHERE salesamt > 0
  ORDER BY s.terr, s.salm

このusing (terr)句は の省略形でon s.terr = t.terrあり、一致する列は両方のテーブルで同じ名前である必要があります。

を追加したのWHERE salesamt > 0は、あなたの明確化要件の 1 つが、販売した営業担当者のみをリストすることだったからです。もちろん、これが当てはまらない場合は、これを削除してください。


提供されたさまざまな回答を取得し、Visual Explain で分析することをお勧めします。これは、さまざまなバリエーションを試して、何がより効果的かを確認できる貴重なツールです。私はこれを IBM i で使用していますが、他の 2 つのプラットフォームにも存在すると思います。

于 2012-08-22T06:20:44.427 に答える