使用SQL中的连接获取摘要输出

时间:2014-12-01 05:53:52

标签: sql sql-server sql-server-2008

我有以下表结构也提到我的预期输出请帮我查询,因为我对SQL查询不太了解

以下是表格结构

select Id,DocumentName from dbo.JoinigDocument

Id  DocumentName
1   Exp letter
2   birth cert
3   Leaving

表2:

SELECT * FROM dbo.EmployeeJoiningDocument

Id  JoiningDocumentId   EmployeeId
1       1                 1
2       3                 1
3       1                 2
4       2                 2
5       3                 2
6       1                 3

表3:

select Id,FName  from dbo.EmployeeDetail

Id  FName
1   Pratik
2   Nilesh
3   Praveen

预期产出: -

DocumentName    FName       Present

Exp letter      Pratik      1
birth cert      Pratik      0
Leaving         Pratik      1
Exp letter      Nilesh      1
birth cert      Nilesh      1
Leaving         Nilesh      1
Exp letter      Praveen     1
birth cert      Praveen     0
Leaving         Praveen     0

3 个答案:

答案 0 :(得分:2)

试试这个:

select JD.DocumentName,ED.FName,
ISNULL(case when COUNT(*)>1 then 1 else 0 end ,0) as Present  
from JoinigDocument JD
cross join  EmployeeDetail ED
LEFT join EmployeeJoiningDocument EJ
on JD.Id=EJ.JoiningDocumentId
group by JD.DocumentName,ED.FName

答案 1 :(得分:2)

您正在寻找employeedocument表的笛卡尔积(交叉连接)。然后你需要outer join到加入表:

select t.documentname, t.fname, count(ejd.id) present
from (
    select d.documentname, d.id documentid, e.fname, e.id employeeid 
    from JoinigDocument d cross join EmployeeDetail e 
) t left join EmployeeJoiningDocument ejd on 
       t.documentid = ejd.joiningdocumentid and t.employeeid = ejd.employeeid
group by t.documentname, t.fname

答案 2 :(得分:1)

使用此查询获取结果。

CREATE TABLE #JoinigDocument
 (
  ID INT,
  DOCName VARCHAR(100)
  )

   CREATE TABLE #EmployeeJoiningDocument
 (
  ID INT,
  JoiningDocumentId INT,
  EmployeeId INT
  )


   CREATE TABLE #EmployeeDetail
 (
  ID INT,
  FName VARCHAR(100)
  )


  INSERT INTo #JoinigDocument
  SELECT 1, 'Exp letter' UNION
  SELECT 2, 'birth cert' UNION
  SELECT 3, 'Leaving'

INSERT INTO #EmployeeJoiningDocument
SELECT 1 ,1 , 1 UNION
SELECT 2 ,3 , 1 UNION
SELECT 3 ,1 ,2 UNION
SELECT 4 ,2 ,2 UNION
SELECT 5 ,3 ,2 UNION
SELECT 6 ,1 ,3


INSErt INTo #EmployeeDetail
SELECT 1, 'Pratik' UNION
  SELECT 2, 'Nilesh' UNION
  SELECT 3, 'Praveen'

  SELECt A.DOCName, A.FName, 
        CASE WHEN D.ID IS NULL 
             THEN 0 ELSE 1 
        END AS Present FROM    
   (SELECT A.ID AS DocID, A.DOCName, B.ID AS EMPID, B.FName 
    FROm #JoinigDocument AS A, #EmployeeDetail AS B) AS A
  LEFT JOIN #EmployeeJoiningDocument AS D
  On A.DocID  = D.JoiningDocumentId AND A.EMPID = D.EmployeeId
  ORDER BY A.EMPID