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どの行から取得するかは明らかにわかりません。また、 を追加できるため、SQL Serverは行からandを返すことができません。pnametitleMAX(dcost)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

Is that you want

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 に答える