在MIN查询中获取其他字段

时间:2013-05-20 11:46:00

标签: sql sql-server

我有一个名为 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&标题也是?

4 个答案:

答案 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,显然不知道要从哪个行pnametitle。由于您可以添加MAX(dcost),因此SQL Server无法从pname行返回titleMIN(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