2015-10-06 75 views
-1

因此,我之前有過這個問題,但我仍在爲此苦苦掙扎。沒有太多的工作,但我會再次嘗試,看看有人在這裏看到我很快犯的錯誤可以評論回來。所以我有table1(employeetimesheets)和table2(projectname)。 我試圖完成的是將table2(projectname)中的projectname列連接到table1(employeetimesheets)中的每個員工,即使記錄不存在。table1和table2之間的關係是table2.pkid = table1.abbrevjob-2並且所有abbrevjob> 11都是自定義項目。 正如我們在表1中可以看到的,員工只有他們已經記錄了時間的數據,但我想抓取所有數據並將其與table2.projectname結合以完成所有縮寫工作 - 2不在那裏(我希望這是有道理的)。下面我展示了一個期望的結果應該是什麼樣子的片段。 除了缺少員工專欄之外,empid = 2應該包含所有數據以及缺少的所有項目名稱,我在以下顯示的項目名稱。到目前爲止,我已經從Case陳述中嘗試過各種各樣的東西,如果存在但是至今沒有運氣。請幫忙解決一些問題。 我希望每個員工都擁有項目名稱,即使他們沒有記錄任何值。設想一個時間表,作爲9個靜態行(項目名稱),然後是每個員工正在處理的其他項目或作業。所以在ssrs中,當我設計ssrs報告時,每個員工將自動擁有9個與項目名稱相對應的靜態行,剩下的將是他們所做的任何工作。即使不將任何時間(值)放入其中,靜態行仍應顯示。 desired results table1Table2在sql中使用if連接表並存在table2中不存在的值

queries

trial1

結果建議查詢檢索的左連接 results to the suggested query for left join

enter image description here

這是我的ssrs報告應該看起來像在末尾的示例

+0

我想你只是想要一個左連接。你的'not exists'子查詢顯然是錯誤的,因爲你沒有過濾任何東西。 – shawnt00

+0

模式和自己的查詢的小提琴幫助我們,也幫助你:)。 –

+0

也添加sqlserver標籤。 –

回答

1

我認爲這是你想要的,我相信Oracle,他們稱之爲「緻密化」。您的數據未規範化,並且與empid值重複。很難弄清楚你需要什麼,但這應該是一個開始。

select e.EmpId, p.pkid, e.Employee, p.project, ets.Day 
from 
    projectname as p 
    cross join 
    /* do you have an employees table? */ 
    (select distinct EmpId, Employee from employeetimesheets) as e 
    left outer join 
    employeetimesheets as ets 
     on ets.projectnames = p.project 
      and ets.Empid = e.Empid 
order by e.EmpId, p.pkid, ets.Day 

如果你可以假設至少有一名僱員會在你的範圍內填寫了每一個約會條目,那麼你不會有「緻密」你輸出的該維度。 (SSRS會爲你填寫矩陣。)如果不是,那麼你有更多的工作要做,但它是一個類似的想法。您可能希望填充日曆日期表以使其更容易。

http://sqlfiddle.com/#!6/3efa6/15

理念的核心是您創建的項目,員工和日期的所有可能的組合。您無法知道數據表中缺少哪些組合,並且數據庫服務器沒有預定義的方式來爲您提供缺少的值。這爲您的報告提供了模板。

得到這些之後,您將數據附加到外部連接。在沒有數據的情況下,您將留下一個null,表示矩陣中的空單元格。

+0

這在查詢中有一點我自己的擺動,但它工作。非常感謝。我想知道你是如何處理這個邏輯的?如果你有時間,請解釋一下 –

+0

非常感謝,我也花時間閱讀密集化,它幫助了很多。 –

0

您需要使用LEFT JOIN。如果您有兩個表,即tab_onetab_two,並且您想要加入表之間的共享列,但保留tab_one中的所有值,但在tab_two中沒有匹配項時,請使用tab_one LEFT JOIN tab_two

所以無需使用特定的列,你可以使用:

SELECT 
    * 
FROM 
    projectname p 
LEFT JOIN 
    employeetimesheets e 
ON 
    p.pkid = e.abbrevjob - 2; 

爲您的查詢。

+0

所以我已經嘗試過了。我已經發布了上面的建議查詢結果。正如我們所看到的,每個empid仍然不會承擔項目名稱的缺失值。查詢只是結合了那些記錄的表格,而我的目標是填寫每個員工缺少的項目名稱。 –

+0

我不明白你想要什麼。您想要連接兩個表,但保留所有與連接條件不匹配的項目名稱。那麼在這些情況下,你希望在第二張表格中發生什麼? – JCollerton

+0

我想要的是每個員工都擁有項目名稱,即使他們沒有記錄任何值。設想一個時間表,作爲9個靜態行(項目名稱),然後是每個員工正在處理的其他項目或作業。所以在ssrs中,當我設計ssrs報告時,每個員工將自動擁有9個與項目名稱相對應的靜態行,剩下的將是他們所做的任何工作。即使不將任何時間(值)放入其中,靜態行仍應顯示。 –

1

我不確定你在幹什麼,但我會用CROSS JOIN來獲得每個項目的所有員工名單。

SELECT DISTINCT Employee, project 
FROM projectname 
CROSS JOIN employeetimesheets 

然後將其餘的查詢加入到此。

我擺弄你的SQLFiddle

相關問題