0

我有一个名为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 和 title?.

4

4 回答 4

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 不能从行返回。pnametitleMIN(dcost)

是的,它可以检测到你只使用了MIN,但它会导致混乱和不一致的结果。

我希望这会有所帮助。

于 2013-05-20T12:05:40.443 回答
1

对于 SQL-Server 2005 及更高版本,您可以使用 CTE 和聚合窗口函数来执行此操作:

; 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 ;
于 2013-05-20T12:10:09.040 回答
-1

是你想要的吗

select Pname,developin, MIN(dcost)as 'total'
from software
group by developin,Pname
order by MIN(dcost)

于 2013-05-20T11:50:40.537 回答
-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
于 2013-05-20T11:58:39.953 回答