2016-10-29 7 views
0

編集:申し訳ありません!私はMicrosoft SQL Serverを使用しています。明確にするためSQLクエリ - 論理エラーを修復する方法

、あなたがなどジョブのリストで「X」という名前の部署、ジョブの別のリストで「Y」という名前の部署、

を持つことができ、私も> = ALLの代わりに使用する必要があります必要に応じて2つ以上の値を返す必要があるため、TOP 1またはMAXを使用する必要があります(job1に20人の従業員があり、job2に20人の従業員があり、両者が最大値であれば、両方とも戻ります)。

私の質問では、私は最も一般的なjobTitleと、このjobTitleの下で働く従業員の数を見つけようとしています。これは、「Research and Development」部門の下にあります。私が書いたクエリは、必要なデータを返すための結合で構成されています。

私が抱えている問題はWHEREステートメントです。 「WHERE声明は、部署が「研究開発」でなければならないと言っているが、問題が最も多いのは、研究開発部門でなければならないということである。従業員は別の部署から来ているため、出力には列名のみが出力されます。

私は、研究開発部門の従業員が最も多い仕事を返すようにクエリをやり直したいと思います。

私はこれがおそらくかなり簡単だと知っています、私は騒ぎです:3助けてくれてありがとう!


SELECT JobTitle, COUNT(JobTitle) AS JobTitleCount, Department 
FROM HumanResources.Employee AS EMP JOIN 
    HumanResources.EmployeeDepartmentHistory AS HIST 
    ON EMP.BusinessEntityID = HIST.BusinessEntityID JOIN 
    HumanResources.Department AS DEPT 
    ON HIST.DepartmentID = DEPT.DepartmentID 
WHERE Department = 'Research and Development' 
GROUP BY JobTitle, Department 
HAVING COUNT(JobTitle) >= ALL (
    SELECT COUNT(JobTitle) FROM HumanResources.Employee 
    GROUP BY JobTitle 
) 

+0

ご使用のデータベースに質問にタグを付けてください。 –

答えて

1

あなたが一列のみをしたい場合は、典型的な方法は次のとおりです。FETCH FIRST 1 ROW ONLYはANSI標準ですが

SELECT JobTitle, COUNT(*) AS JobTitleCount 
FROM HumanResources.Employee AS EMP JOIN 
    HumanResources.EmployeeDepartmentHistory AS HIST 
    ON EMP.BusinessEntityID = HIST.BusinessEntityID JOIN 
    HumanResources.Department AS DEPT 
    ON HIST.DepartmentID = DEPT.DepartmentID 
WHERE Department = 'Research and Development' 
GROUP BY JobTitle 
ORDER BY COUNT(*) DESC 
FETCH FIRST 1 ROW ONLY; 

、いくつかのデータベースは、それLIMITあるいはSELECT TOP (1)を綴ります。

SELECTGROUP BYの両方からDEPARTMENTを削除しました。それは冗長なようだ。

私が推測しなければならないのは、ヒストリテーブルのためにクエリが結果を過大評価するということです。この場合、と別の質問をサンプルデータと希望の結果でご連絡ください。

EDIT:

SQL Serverでは、ウィンドウ関数の使用をお勧めします。 、重複がある場合には、そのようなすべてのタイトルを取得する代わりにROW_NUMBER()RANK()DENSE_RANK()を使用するには

SELECT JobTitle, JobTitleCount 
FROM (SELECT JobTitle, COUNT(*) AS JobTitleCount, 
      ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as seqnum 
     FROM HumanResources.Employee AS EMP JOIN 
      HumanResources.EmployeeDepartmentHistory AS HIST 
      ON EMP.BusinessEntityID = HIST.BusinessEntityID JOIN 
      HumanResources.Department AS DEPT 
      ON HIST.DepartmentID = DEPT.DepartmentID 
     WHERE Department = 'Research and Development' 
     GROUP BY JobTitle 
    ) j 
WHERE seqnum = 1; 

:トップの役職を取得します。

関連する問題