sql-销售人员按地域查询-将多个语句与with子句组合

sql-销售人员按地域查询-将多个语句与with子句组合,sql,db2,with-statement,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

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


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

为什么不在单个查询中执行它

SELECT Territory, SalesMan, COUNT(*) as [No. of Salesman]
FROM tableName
GROUP BY Territory, SalesMan
他们在不同的桌子上吗?例如,
TERR
SALM

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

虽然我想使用该语句的OLAP版本,但我的DB2版本(V6R1)不支持该上下文中的
COUNT()
函数(boohoo)。这就是说,这里有一个版本确实有效,并且应该适用于任何其他RDBMS(我认为):


请注意
COUNT()
中的
DISTINCT
,因为这是阻止销售人员在每个期间被计数的原因

我认为使用公共表表达式[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)
子句是s.terr=t.terr上的
的简写,其中匹配列在两个表中必须具有相同的名称

我添加了
WHERE salesamt>0
,只是因为您的澄清要求之一是只列出有销售记录的销售人员。如果这不适用,当然可以将其取出



把提供的各种答案拿出来,用直观的解释进行分析可能是个好主意。这是一个很有价值的工具,您可以在其中尝试不同的变体,并查看哪些性能更好。我在IBM I上使用了它,但我相信它也存在于其他两个平台上。

所有数据都来自单个表此表包含Terr/Saleser/Period的事务摘要。我想进一步向Terr/Saleser解释一下,然后在每条线上显示每个地区的销售人员数量。您可能还想标记问题,以确定您使用的是哪种平台:大型机、ibm中端或db2-luw。另一个很好的例子!短短几句话就有这么大的力量!你认为值得称赞的答案,你可以向上投票(点击向上三角形)。这将奖励作者更多的声望点数。这适用于你的问题与否,也适用于问题。谢谢你指出我的错误。我已经删除了我的答案。回想起来,穆斯塔法的评论似乎一直在暗示同一件事,而我没有领会到这一暗示。
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
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