2016-05-15 85 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小提琴。