1

次のデータベース設計があります。

Employees Table: EmployeeID, Name, OrgCode
Departments Table: OrgCode, DepatName
CompleteSurvey Table: ID, ParticipantID

また、各部門の従業員の総数と、各部門で調査を完了した参加者の総数を示す表も作成する必要があります。次に、各部門の参加率を示したいと思います。これは、主に参加者の総数/従業員の総数に等しくなります。

次の 2 つのクエリを思いついたのですが、上記の要件を示すクエリを 1 つ考え出さなければならないので、どうすればよいでしょうか?


各部門の総従業員数:

SELECT COUNT(DISTINCT dbo.Employees.EmployeeID) AS [Total Number of Employees], 
       dbo.Departments.DepartmentName
FROM dbo.Departments 
INNER JOIN dbo.Employees ON dbo.Departments.OrgCode = dbo.Employees.OrgCode
GROUP BY dbo.Departments.DepartmentName

各部門の合計参加者数:

 SELECT COUNT(DISTINCT dbo.Employees.EmployeeID) AS [Total Number of Employees], 
 dbo.Departments.DepartmentName
 FROM dbo.Departments 
 INNER JOIN dbo.Employees ON dbo.Departments.OrgCode = dbo.Employees.OrgCode 
 INNER JOIN dbo.CompleteSurvey ON dbo.Employees.EmployeeID = dbo.CompleteSurvey.RespondantID
 GROUP BY dbo.Departments.DepartmentName

参加者を表示する 2 番目のクエリの問題は、参加者がいない場合でもすべての部門が表示されるわけではなく、ゼロが表示されるはずです。

アップデート:

基本的に、私が欲しいのは、各部門の従業員の総数と、各部門の調査を完了した参加者の総数を示す 1 つのクエリを作成し、参加率を示すことです。

4

2 に答える 2

2

このようなものを探していますか (テーブル変数を使用)

DECLARE @Employees Table(EmployeeID INT, Name VARCHAR(50), OrgCode VARCHAR(50) )  
DECLARE @Departments Table( OrgCode INT, DepartmentName  VARCHAR(50)     )
DECLARE @CompleteSurvey Table( ID INT, RespondantID INT) 

INSERT INTO  @Employees VALUES(12,'Emp 12', 1000),(13,'Emp 13', 1000),(112,'Emp 112', 2000),    (113,'Emp 114', 2000)
INSERT INTO @Departments VALUES(1000, 'dept 1000'),(2000, 'dept 2000')
,(3000, 'no employee dept 3000')
INSERT INTO @CompleteSurvey VALUES (901,12), (901,112),(902,13), (902,112)

SELECT COUNT(DISTINCT  EmployeeID) AS [Total Number of Employees],  D.DepartmentName FROM     @Departments D 
LEFT OUTER JOIN @Employees E
ON  D.OrgCode =  E.OrgCode GROUP BY  D.DepartmentName

SELECT D.DepartmentName,COUNT(DISTINCT E.EmployeeID) AS [Total Number of Employees], 
COUNT(DISTINCT S.RespondantID )AS completed_survey ,
CASE WHEN COUNT(DISTINCT E.EmployeeID)>0 THEN COUNT(DISTINCT S.RespondantID )/
CAST(COUNT(DISTINCT E.EmployeeID)AS FLOAT)*100 ELSE 0 END AS particPerc
FROM @Departments D LEFT OUTER JOIN @Employees E ON D.OrgCode = E.OrgCode 
LEFT OUTER JOIN @CompleteSurvey S ON E.EmployeeID =S.RespondantID GROUP BY D.DepartmentName

出力:

 Total Number of Employees  DepartmentName
  2                       dept 1000
  2                       dept 2000
  0                       no employee dept 3000

そして最後に、あなたが求めていると思うもの

DepartmentName  Total Number of Employees   completed_survey   particPerc
dept 1000                  2                             2          100
dept 2000                  2                             1           50
no employee dept 3000        0                           0            0
于 2012-05-15T17:10:05.633 に答える
2

従業員が調査を送信したときに、CompleteSurvey に EmployeeID が入力されていることを正しく理解していれば、このクエリによって必要な情報が取得されます。ライブ テスト @ Sql Fiddleを確認できます。

select Departments.DepatName, 
       count (Employees.EmployeeID) Employees, 
       count (CompleteSurvey.ID) Finished,
       cast (count (CompleteSurvey.ID) as float) / count (Employees.EmployeeID)
            PercentageFinished
  from Departments
 inner join Employees 
    on Departments.OrgCode = Employees.OrgCode
  left join CompleteSurvey 
    on Employees.EmployeeID = CompleteSurvey.ParticipantID
 group by Departments.DepatName

すべての部門が必要な場合は、次のクエリを使用します。

select Departments.DepatName, 
       count (Employees.EmployeeID) Employees, 
       count (CompleteSurvey.ID) Finished,
       case when count (Employees.EmployeeID) <> 0
            then cast (count (CompleteSurvey.ID) as float) 
                     / count (Employees.EmployeeID)
            else 0
        end PercentageFinished
  from Departments
  left join Employees 
    on Departments.OrgCode = Employees.OrgCode
  left join CompleteSurvey 
    on Employees.EmployeeID = CompleteSurvey.ParticipantID
 group by Departments.DepatName

新しいテスト @ Sql Fiddle

于 2012-05-15T17:13:55.277 に答える