0

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 でこれを行っていることにも注意してください。そのため、役立つ可能性のある特別な関数やコマンドはすべて公正なゲームです。

4

1 に答える 1

1

で使用COUNT()して、目的のOVER()ものを取得できます。

;with cte AS (SELECT *,COUNT(*) OVER(PARTITION BY DepartmentID) AS Department_CT
              FROM   Employee)
SELECT *
FROM cte a
JOIN  Department b
  ON a.DepartmentID = b.DepartmentID
WHERE Department_CT = 1

これにより、フィルタリングのために集計を返すだけでなく、完全な詳細を保持することができます。

于 2014-10-15T19:37:32.960 に答える