我们有一个地区/销售人员关系,其中:每个地区(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。
答案 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
他们在不同的桌子上吗?例如,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
答案 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上使用它,但我相信它也存在于其他两个平台上。