Sql 在MIN查询中获取其他字段

Sql 在MIN查询中获取其他字段,sql,sql-server,Sql,Sql Server,我有一个名为soft的表,其中包含以下字段: pname, title, developin, dcost 这里pname是每个程序员的名字。 title是已开发项目的名称。 developin是用于开发项目的语言。 dcost是项目的开发成本 我需要一个查询,它将显示程序员的名字&他们用每种语言开发的最便宜的软件包 所以我尝试了这个查询: SELECT developin, MIN(dcost) as 'total' FROM software GROUP BY developin ORDE

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

是您想要的吗

选择Pname、developin、MIN(dcost)作为“总计”
来自软件
按开发分组,Pname

按分钟排序(dcost)

像这样的东西可能就可以了

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
这应该做到:

SELECT *
FROM software s
WHERE dcost = (SELECT MIN(dcost)
               FROM software
               WHERE developin = s.developin
               GROUP BY developin)
或,使用
连接

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 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
考虑
MIN(dcost),MAX(dcost)
-这将得到
dcost
的最小值和最大值。因此,很明显,整个返回行不能属于包含
MIN(dcost)
的行

现在考虑<代码> min(dCube)、马克斯(dBASE)、pNED、标题< /代码>,它显然不知道哪个行接受<代码> pNeN/COD>和<代码>标题<代码>。由于可以添加

MAX(dcost)
,SQL Server无法从
MIN(dcost)
行返回
pname
title

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


我希望这会有所帮助。

对于SQL Server 2005及更高版本,您可以使用CTE和:


javed khan很抱歉这么说,但是这个查询不会给我所需的输出。从我的查询中,我得到以下结果c 700 cpp 1200 assembly3000 cobol 3500 pascal 4500 basic 6000 dbase 20000 oracle 85000我只想要另一个列,显示我的姓名,即pnameselect Pname,developpin,MIN(dcost)作为“总计”。。。PName已添加到查询中…您现在必须获得三列…当select查询中有三个列名,而您仍然获得2@qasimjaved我正在从您的查询中获取所有3列,但它没有给我所需的o/p,我希望它将显示名称,每种产品都有最便宜的包装langauge@danbracuk很抱歉这么说,但是这个查询也没有为我提供正确的输出现在我已经修复了语法(oops),它应该为您提出的问题提供结果。如果输出不正确,请编辑您的问题并提供一些示例数据和查询结果。您的查询返回“对于每个程序员和语言,最便宜的项目”,这似乎就是问题所要求的。但问题中的代码是“对于每种语言,最便宜的项目”。你可能想在答案中指出这一点。你也应该说
@prags
,否则您的评论将不会触发通知。@dukeling第一个查询对我有效&谢谢您的帮助……我您不介意,请您告诉我哪里出了错……因为我正处于学习阶段,如果可能的话,请您解释一下……我了解了它们之间的区别……谢谢您的帮助……这一点查询也给出了正确的结果…我尝试了这种cte方法,但未能正确实现…现在我犯了错误…感谢您的帮助,我想知道您是否可以在没有cte的情况下使用
来获得相同的结果。类似于在中使用OVER子句和聚合函数的
,我知道这完全不同。您可以使用派生表而不是CTE(如果您是这样要求的话)。不,我的意思是没有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 ;