sql - 按区域查询的销售人员 - 将多个语句与WITH子句组合在一起

时间:2012-08-21 03:18:20

标签: sql db2 with-statement

我们有一个地区/销售人员关系,其中:每个地区(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。

3 个答案:

答案 0 :(得分:2)

虽然我想使用该语句的OLAP版本,但我的DB2(V6R1)版本不支持该上下文中的COUNT()函数(boohoo)。也就是说,这是一个 工作的版本,应该适用于任何其他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() ,因为这样可以防止销售人员在每个期间内被计算在内。

答案 1 :(得分: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

答案 2 :(得分:0)

我会说你使用公共表格表达式在正确的轨道上[aka。 WITH clause],但可以在一个语句中轻松有效地完成。

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上使用它,但我相信它也存在于其他两个平台上。