Employee テーブルと Department テーブルがあるとします。すべての従業員には 1 つの部門があります。
ここで、従業員が 1 人だけいるすべての部門(それらの部門の従業員と一緒に)を表示したいとします。
私のデータベースがこのように見えるとしましょう。
従業員
EmployeeId | EmployeeName | DepartmentId
--------------------------------------------
1 | A Doe | 1
--------------------------------------------
2 | B Doe | 1
--------------------------------------------
3 | C Doe | 1
--------------------------------------------
4 | D Doe | 1
--------------------------------------------
5 | E Doe | 2
--------------------------------------------
デパートメント
DepartmentId | DepartmentName
------------------------------------------
1 | Sales
------------------------------------------
2 | HR
------------------------------------------
私が見たいのは、次の結果です。
DepartmentName | EmployeeId | EmployeeName | EmployeeId_COUNT
------------------------------------------------------------------
HR | NULL | NULL | 1
------------------------------------------------------------------
HR | 5 | E Doe | 1
------------------------------------------------------------------
明らかに、これは複数の個別のクエリで実行できます。
しかし、これを単一のクエリで解決する方法を知っている人はいますか?
私の最初のアイデアは、このような単純なことをすることでした
SELECT
d.DepartmentName 'Department'
, e.EmployeeId 'EmployeeId'
, e.EmployeeName
, COUNT(e.EmployeeId) 'EmployeeId_COUNT'
FROM Employee e
LEFT JOIN Department d ON d.DepartmentId = e.DepartmentId
GROUP BY GROUPING SETS (
( d.DepartmentName ),
( d.DepartmentName, e.EmployeeId, e.EmployeeName) )
HAVING COUNT(e.EmployeeId) IN (1)
しかし、グループ化されていないすべての行 (および一部のグループ化された行) の EmployeeId カウントは 1 であるため、これは機能しません。
したがって、結果は次のようになります。
DepartmentName | EmployeeId | EmployeeName | EmployeeId_COUNT
------------------------------------------------------------------
HR | NULL | NULL | 1
------------------------------------------------------------------
HR | 5 | E Doe | 1
------------------------------------------------------------------
Sales | 1 | A Doe | 1
------------------------------------------------------------------
Sales | 2 | B Doe | 1
------------------------------------------------------------------
Sales | 3 | C Doe | 1
------------------------------------------------------------------
Sales | 4 | D Doe | 1
------------------------------------------------------------------
これは私が望んでいるものではありません。
私の理想的なソリューションは単純で (複雑な内部クエリ、UNION、または INTERSECT は必要ありません)、同様の問題 (SUM、MAX、MIN など、およびより複雑なクエリの他の列) に簡単に一般化できます。
また、T-SQL 2012 でこれを行っていることにも注意してください。そのため、役立つ可能性のある特別な関数やコマンドはすべて公正なゲームです。