无法加入并获得最终查询

时间:2016-12-06 03:25:44

标签: sql ado.net

我遇到以下情况,我无法形成SQL查询。请帮帮我。

create table student(
    studentName varchar(50)
);

Insert into student values('abc');
Insert into student values('mnop');
Insert into student values('xyz');
Insert into student values('pqrs');

create table workAssigned (
    topic varchar(50),
    creator varchar(50),
    reviewer varchar(50),
    creationCount decimal(4,2)
    reviewCount decimal(4,2)
);

insert into workAssigned values('algebra','abc','mnop',1.25,0.75);
insert into workAssigned values('geometry','mnop','xyz',1.5,0.25);
insert into workAssigned values('algorithms','mnop','xyz',1.5,1.5);
insert into workAssigned values('derivative','xyz','abc',0.25,1);

最终输出需求是:

StudentName    NumberOfWorkDone    Effort
abc                    2            2.25                 
mnop                   3            3.75
xyz                    3              2
pqrs                  NUll         NULL

NumberOfWorkDone是创建者和审稿人的总和,以及       努力是creationCount和reviewCount的总和

3 个答案:

答案 0 :(得分:2)

您可以尝试将Group ByJoinCASEAggregate functions一起使用,

SELECT studentName,
SUM(CASE WHEN W.creator = S.studentName OR S.studentName = W.reviewer THEN 1 ELSE NULL END ) AS NumberOfWorkDone,
SUM(CASE WHEN W.creator = S.studentName THEN W.creationCount WHEN S.studentName = W.reviewer THEN W.REVIEWCOUNT ELSE NULL END) AS Efforts
FROM student S
LEFT JOIN workAssigned W
ON S.studentName = W.creator OR S.studentName = W.reviewer
GROUP BY studentName

我已将NULL添加到其他部分的Case语句中,因为您的输出显示NULL但我认为如果用0替换它会更好。

答案 1 :(得分:1)

Select studentName,NumberOfWorkDone,Effort
From student as A
Left Join
(
    Select creator,count(creator) as NumberOfWorkDone,sum(creationCount) as Effort
    From
    (
        Select creator,creationCount
        from workAssigned as A
        Union all
        Select reviewer,reviewCount from workAssigned
    )as A
    Group by creator
)as B
On A.studentName=B.creator

答案 2 :(得分:0)

select * from
 (select count(col_X) as F, col_X
  from 
 (select creator as col_X from workAssigned
  UNION ALL
 select reviewer as col_X from workAssigned) AS A
  group by col_X) as E
left join
 (select A, sum(B)
  from
 (select creator as A, creationCount as B
  from workAssigned
  UNION ALL
  select revieweras A, reviewCount as B
  from workAssigned) as C
  group by A) as D
on E.F = D.A