2016-05-15 154 views
0

如何结合这三个查询而不给我相同的输出?如何结合这三个SQL查询

第一个查询是:

select 
    vwemployee.directorateName, 
    count(vwemployeeCourse.employeeId) as t1 
from 
    vwemployee, vwemployeeCourse 
where 
    vwemployee.directorateName = vwemployeeCourse.directorateName 
group by 
    vwemployee.directorateName 

这是第二次查询:

选择 vwemployee.directorateName, 计数(vwemployee.directorateName),如从 vwemployee T2 ,employeeCourse 其中 vwemployee.Id = employeeCourse.employeeId group by vwemployee.directorateName

这是第三个查询:

select 
    vwemployeeCourse.directorateName, sum(vwCourse.cost) as t3 
from 
    vwemployeeCourse, vwCourse 
where 
    vwemployeeCourse.courseId = vwCourse.Id 
group by 
    vwemployeeCourse.directorateName 

我将使用组合查询生成报告

  • 的T1栏应该显示这个特定的董事会有多少课程,花了

  • t2栏应显示此董事会下有多少员工参加了此课程

  • 的T3栏应该显示课程花了多少钱,每局

因此,组合查询的表的总列应该是4列

FYI:一些不错的人在这里帮助我把前两个查询结合起来,但它根本不是样例,我没有成功地向他们添加第三个查询,因为我是初学者,所以请帮助我完整的简单查询以了解它以备将来参考。

+0

如果目标是合并它们,那么您可以使用Union子句。 –

+0

[踢坏的习惯:使用旧式JOIN](http:// sqlblog。com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 旧样式*逗号分隔的表格样式被替换为*正确*在ANSI ANSI ** 92 ** SQL标准中使用ANSI'JOIN'语法并且不鼓励使用它 –

回答

2

我认为你正在寻找一些像这样。我们可以使用NESTED CTE来实现这一点。你可以在这里看到我创建了3个嵌套的CTE,最后我用了所有三个CTE来获得你的结果。

with cte1 as 
(
select vwemployee.directorateName , count(vwemployeeCourse.employeeId) as t1 

from vwemployee , vwemployeeCourse 

where vwemployee.directorateName = vwemployeeCourse.directorateName 

GROUP BY vwemployee.directorateName 
) 
,cte2 as 
(
select vwemployee.directorateName , count(vwemployee.directorateName) as t2 

from vwemployee , employeeCourse 

where vwemployee.Id = employeeCourse.employeeId 

GROUP BY vwemployee.directorateName 
) 
,cte3 as 
(
select vwemployeeCourse.directorateName , sum(vwCourse.cost) as t3 

from vwemployeeCourse , vwCourse 

where vwemployeeCourse.courseId = vwCourse.Id 

group by vwemployeeCourse.directorateName 
) 
select cte1.directorateName, cte1.t1, cte2.t2, cte3.t3 
from 
cte1 inner join cte2 
on cte1.directorateName = cte2.directorateName 
inner join cte3 on 
cte2.directorateName = cte3.directorateName 
+0

这就是我执行建议查询时发生的事情 : http://i.stack.imgur.com/bMKZW.png –

+0

有一个错字,我做了更正。你可以再试一次吗? –

+0

也作为@marc_s提到,请使用连接。我没有注意到您在查询中使用了逗号分隔的表格。 –

0

首先,您应该使用明确的JOIN语法。简单的规则:从不FROM子句中使用逗号。

然后,给出写的,没有其他信息的三个疑问,我想我会去full outer joinunion all与聚集:

with ec as (
     select e.directorateName, count(ec.employeeId) as t1 
     from vwemployee e join 
      vwemployeeCourse ec 
      on e.directorateName = ec.directorateName 
     group by e.directorateName 
    ), 
    ed as (
     select e.directorateName, count(ec.directorateName) as t2 
     from vwemployee e join 
      vwemployeeCourse ec 
      on e.id = ec. employeeId 
     group by e.directorateName 
    ), 
    cc as (
     select ec.directorateName, sum(c.cost) as t3 
     from vwemployeeCourse ec join 
      vwCourse c 
      ec.courseId = c.Id 
     group by ec.directorateName 
    ) 
select directoratename, 
     coalesce(t1, 0) as t1, 
     coalesce(t2, 0) as t2, 
     coalesce(t3, 0) as t3 
from ((select directoratename, t1, null as t2, null as t3 from ec) 
     union all 
     (select directoratename, null as t1, t2, null as t3 from ed) 
     union all 
     (select directoratename, null as t1, null as t2, t3 from cc) 
    ) t; 

话虽如此,我不认为这个查询实际上可以做有用的事情。在两个不同的密钥上连接两个表,然后通过相同的密钥聚合(eced)通常不会完成。如果这不会产生你想要的结果,那么问另一个问题,提供样本数据,所需结果和一个SQL小提琴。