在不使用参数的情况下,我无法找到在下面进行查询的方法。数据库有超过2000个可能的参数值,所以我想要的是输出一个表,列出一列中的所有参数,另一个列中的查询输出。以下是现在有效的简化版本:
SELECT [enter name] AS ExclName,
Sum(revenue) AS MaxRev
FROM tbltasks
WHERE tbltasks.task IN (SELECT DISTINCT tblabilities.task
FROM tblabilities
WHERE tblabilities.name <> [enter name]);
tbltasks tblpeople tblabilities
task revenue name name task
A 10 Bob Bob A
B 9 Tom Tom A
C 8 Jack Jack A
D 7 Mary Tom B
E 6 Diane Jack B
F 5 Alice Mary B
G 4 Sam Jack C
H 3 Mary C
I 2 Diane C
Mary D
Diane D
Alice D
Diane E
Alice E
Sam E
Bob F
Tom G
Alice H
现在我运行查询,在提示时手动输入类似“Bob”的名称,并获得单行输出,如:
ExclName MaxRev
Bob 47
但我想要的是完整的表格:
ExclName MaxRev
Bob 47
Tom 48
Jack 52
Mary 52
Diane 52
Alice 49
Sam 52
或者换句话说,我想知道排除指定成员的团队可以实现的最大收入。真正的应用程序更复杂,因为涉及其他分组(例如,如果排除杰克,也必须排除玛丽),但我认为如果我解决上面的简单问题,我可以处理其余的。
我一直认为必须有一种方法可以使用来自tblPeople的名称并使用单个查询将它们链接到MaxRev计算,但我无法弄明白。我可以做一些代码来遍历所有参数,但我希望有一个更简单的解决方案。感谢任何人的意见。
答案 0 :(得分:0)
您可以简单地为所有人扩展您的查询:
select
p.name as ExclName,
sum(t.revenue) as MaxRev
from tblpeople as p
cross join tbltasks as t
where
t.task in
(
select l.task
from tblabilities as l
where l.name <> p.name
)
group by p.name
<强>更新即可。仍然不知道你使用哪个RDBMS,这里是SQL Server解决方案,可以将下面的解决方案拆分为临时表,变量和查询以提高性能,但它应该比第一个更快(如果你有适当的索引)表):
with cte as (
select l.[name], sum(t.[revenue]) as [revenue]
from tblabilities as l
inner join tbltasks as t on t.[task] = l.[task]
where
not exists
(
select *
from tblabilities as tl
where tl.[task] = l.[task] and tl.[name] <> l.[name]
)
group by l.[name]
)
select
p.[name] as ExclName,
t.revenue_total - isnull(c.[revenue], 0) as MaxRev
from tblpeople as p
left outer join cte as c on c.[name] = p.[name]
outer apply (
select sum(tt.[revenue]) as revenue_total
from tbltasks as tt
where
tt.[task] in (select tl.[task] from tblabilities as tl)
) as t
order by p.[name]