我有一个名为soft的表,其中包含以下字段:
pname, title, developin, dcost这里,pname是每个程序员的名字。
title是已开发项目的名称。
developin是用于开发项目的语言。
dcost是项目的开发成本。
我需要一个查询,它将显示程序员的名字&他们用每种语言开发的最便宜的包。
所以我尝试了这个查询:
SELECT developin, MIN(dcost) as 'total'
FROM software
GROUP BY developin
ORDER BY MIN(dcost)使用这个查询,我得到了每种语言的最低成本,但是,,我如何也显示名称和标题?。
发布于 2013-05-20 12:05:40
这应该可以做到:
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),Server无法从MIN(dcost)行返回pname和title。
是的,它可以检测到您只使用MIN,但是它会导致混淆和不一致的结果。
我希望这能帮上忙。
发布于 2013-05-20 12:10:09
对于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-20 11:50:40
是你想要
select Pname,developin, MIN(dcost)as 'total'
from software
group by developin,Pname
order by MIN(dcost)
https://stackoverflow.com/questions/16648813
复制相似问题