我有一个名为 soft 的表格,其中包含以下字段:
pname, title, developin, dcost
这里pname
是每个程序员的名字
title
是已开发项目的名称
developin
是用于开发项目的语言
dcost
是项目的开发成本。
我需要一个查询,它将显示程序员和程序员的姓名。他们用各种语言开发的最便宜的软件包。
所以我尝试了这个查询:
SELECT developin, MIN(dcost) as 'total'
FROM software
GROUP BY developin
ORDER BY MIN(dcost)
通过此查询,我获得了每种语言的最低成本,但如何显示pname&标题也是?。
答案 0 :(得分:2)
这应该这样做:
SELECT *
FROM software s
WHERE dcost = (SELECT MIN(dcost)
FROM software
WHERE developin = s.developin
GROUP BY developin)
或者,使用JOIN
:
SELECT s.*
FROM software s
JOIN (SELECT developin, MIN(dcost) AS cost
FROM software
GROUP BY developin) s2
ON s.developin = s2.developin AND s.dcost = s2.cost
我不确定是否可以不使用子查询。
为什么只在查询的, pname, title
部分添加SELECT
无效:
考虑MIN(dcost), MAX(dcost)
- 这将获得dcost
的最小值和最大值。很明显,整个返回的行不能属于包含MIN(dcost)
的行。
现在考虑MIN(dcost), MAX(dcost), pname, title
,显然不知道要从哪个行pname
和title
。由于您可以添加MAX(dcost)
,因此SQL Server无法从pname
行返回title
和MIN(dcost)
。
是的,它可以检测到您只使用MIN
,但会导致混乱和不一致的结果。
我希望有所帮助。
答案 1 :(得分:1)
对于SQL-Server 2005及更高版本,您可以使用CTE和aggregate window function执行此操作:
; WITH cte AS
( SELECT pname, title, developin, dcost,
MIN(dcost) OVER (PARTITION BY developin) AS total
FROM software
)
SELECT pname, title, developin, dcost
FROM cte
WHERE dcost = total
ORDER BY total ;
答案 2 :(得分:-1)
你想要吗
select Pname,developin, MIN(dcost)as 'total'
from software
group by developin,Pname
order by MIN(dcost)
答案 3 :(得分:-1)
这样的事情可能会这样做。
select pname, developin, title, dcost
from software join
(select pname name, developin lang, min(dcost) mincost
from software
group by pname, developin) temp on name = pname
and developin = lang
and dcost = mincost