0

目標 - 各部門の男性の平均給与と女性の平均給与をリストします。部門名と部門番号を表示します。

 select AVG(salary) as 'Avg salary for men' 
   From [Enterprise].[dbo].[Employee]JOIN [Enterprise].[dbo].[Department]
   ON Employee.EMPNO = Department.deptNo
   where SEX = 'm'

ここで外部結合が必要かどうかまだ結合を学習していませんか? そして、部門ごとに平均をリストするにはどうすればよいですか?

4

7 に答える 7

1

まず第一に、 の間違った列を使用しているようEmployeeですJOIN。つまり、クエリは次のようになります。

SELECT  D.deptNo,
        D.deptName,
        AVG(CASE WHEN E.SEX = 'm' THEN salary END) [Avg salary for men],
        AVG(CASE WHEN E.SEX = 'f' THEN salary END) [Avg salary for women]
FROM [Enterprise].[dbo].[Employee] E
INNER JOIN [Enterprise].[dbo].[Department] D
    ON E.deptNO = D.deptNo     -- use the right column from Employee here
GROUP BY D.deptNo,
         D.deptName
于 2013-11-04T21:11:40.893 に答える
1

までに参加するつもりだったと思いますdeptNo

SELECT Department.Name, AVG(salary) as 'Avg salary for men' 
FROM [Enterprise].[dbo].[Employee]
JOIN [Enterprise].[dbo].[Department]
ON Employee.deptNo= Department.deptNo
WHERE SEX = 'm'
GROUP BY Department.Name

これにより、男性の各部門の平均が表示されます。女性についても同じことができ、 を使用してクエリに含めることができますUNIONGROUP BYまたは、性別に追加して、WHERE句を完全に削除します。

GROUP BYのリストは通常​​、リスト内の集計されていない列と一致しますSELECT。この場合、Department.Name だけです。

于 2013-11-04T21:11:01.877 に答える
0
SELECT Employee.EMPNO, Department.Name, SEX, AVG(salary) as [Avg salary] 
FROM [Enterprise].[dbo].[Employee]JOIN [Enterprise].[dbo].[Department]
   ON Employee.EMPNO = Department.deptNo
GROUP BY Employee.EMPNO, Department.Name, SEX

これによりデータが取得されます。ここから、必要に応じてフォーマットできます。

于 2013-11-04T21:11:28.660 に答える
-1

指摘したように、結合条件は意味がありません。従業員番号を部門番号に結合していますが、これは一致しません (または一致しますが、希望するロジックを達成しません)。

SELECT
  d.name
, AVG(e_man.salary) avg_man
, AVG(e_woman.salary) avg_woman
FROM department d
LEFT OUTER JOIN employee e_man ON e_man.deptNo = d.deptNo AND e_man.sex = 'm'
LEFT OUTER JOIN employee e_woman ON e_woman.deptNo = d.deptNo AND e_woman.sex = 'f'
GROUP BY d.name

ここでは、男性の行に 1 回、女性の行に 1 回、合計 2 回結合し、それらに基づいて平均を計算します。OUTER 結合は、男性/女性がいない場合に使用されます。


注: 私のクエリは、男性と女性の平均を 2 列として、部門ごとに 1 つの行を返します。別の解決策は、部門ごとに 0 ~ 2 行を返し、性別ごとに別々の行を返し、行/性別ごとに関連する給与を一覧表示することです。


編集:人々が非常に不満を持っているように見える代替サブクエリソリューション。私の経験では、サブクエリが正しい答えである場合もあれば、結合が正しい答えである場合もあります。パフォーマンスを犠牲にしない限り、論理的な目的/表現に最も適した方を使用することがよくあります。使用している RDBMS のオプティマイザは、とにかくそれを書き換えることがよくあります。いつものように、計画を確認して、何が起こっているかを確認することをお勧めします。

SELECT
  d.name
, (
    SELECT AVG(e1.salary)
    FROM employee e1
    WHERE e1.sex = 'm'
    AND e1.deptNo = d.deptNo
  ) avg_man
, (
    SELECT AVG(e2.salary)
    FROM employee e2
    WHERE e2.sex = 'f'
    AND e2.deptNo = d.deptNo
  ) avg_woman
FROM department d
于 2013-11-04T21:09:57.173 に答える