1

我们有一个区域/销售员关系,其中:每个区域 (TERR) 可能有多个销售员 (SALM),但每个销售员只能有一个区域。

例子:

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
) 

// 最后一步是将上述两个步骤结合起来。如果可能的话,我想将所有三个步骤合并到一个语句中。有没有更有效的方法来做到这一点。我正在使用 IBM db/2 SQL。

4

3 回答 3

2

虽然我想使用语句的 OLAP 版本,但我的 DB2 版本(V6R1)不支持该COUNT()上下文中的函数(嘘)。也就是说,这是一个可以工作的版本并且应该可以在任何其他 RDBMS 上工作(我认为):

SELECT DISTINCT terr, salm, salesmen
FROM File -- I really hope that's not your file name - it's a reserved word
JOIN (SELECT terr territory, COUNT(DISTINCT salm) salesmen
      FROM File
      GROUP BY terr) Salesmen_Per_Territory
ON territory = terr

请注意DISTINCT 内部 COUNT(),因为这是阻止推销员在每个时期都被计算在内的原因。

于 2012-08-21T16:36:07.863 回答
0

为什么不在单个查询中进行呢?

SELECT Territory, SalesMan, COUNT(*) as [No. of Salesman]
FROM tableName
GROUP BY Territory, SalesMan

他们在不同的桌子上吗?例如,TERRSALM

SELECT  a.Territory, b.SalesMan, Count(b.Territory) as [No. of Salesman]
FROM    Terr a 
            INNER JOIN SALM b
                on a.Territory = b.Territory
GROUP BY a.Territory, b.SalesMan
于 2012-08-21T03:22:17.493 回答
0

我会说您使用公用表表达式 [aka. WITH 子句],但它可以在一个语句中轻松有效地完成。

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唯一的,因为您的澄清要求之一是仅列出有销售的销售人员。如果这不适用,当然把它拿出来。


获取提供的各种答案并使用 Visual Explain 分析它们可能是一个好主意。这是一个有价值的工具,您可以在其中尝试不同的变体,看看哪些表现更好。我在 IBM i 上使用它,但我相信它也存在于其他两个平台上。

于 2012-08-22T06:20:44.427 回答