iT邦幫忙

0

關於MSSQL兩個資料表結合?

  • 分享至 

  • xImage

我有A,B兩個資料表,A資料表有所有15個員工的當年度所擁有的特休假數,B資料表是員工請假的資料,我用SQL語法將A,B兩表可以查詢出有請假的員工資料,剩下幾天的特休假,可是有一個問題,假設明年度開始有些人還未請假,所以用SQL語法查詢出的結果不會顯示出來,我要怎麼做才能將A資料表全部顯示員工出來,但是又可以和B資料表結合,最後可以顯示所有員工應修特休假,未修特休假,還沒修特休假則顯示NULL。

看更多先前的討論...收起先前的討論...
外獅佬 iT邦大師 1 級 ‧ 2012-12-20 17:09:01 檢舉
好眼熟的問題....
您的問題與這一題有異曲同工之妙....
請參考以下這篇中的 3.1 Left Outer Join
一次滿足三個願望

Employee 對應你的 A 資料表
Department 對應你的 B 資料表
badboy01 iT邦新手 2 級 ‧ 2012-12-21 21:32:20 檢舉
謝謝大大意見,已經可以成功跑出結果。
badboy01 iT邦新手 2 級 ‧ 2012-12-21 21:32:26 檢舉
謝謝大大意見,已經可以成功跑出結果。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
12
player
iT邦大師 1 級 ‧ 2012-12-20 17:12:18
最佳解答

SQL 有橫向串接 (關聯查詢)
join
與垂直串接 (跨Table同欄位的資料串起來)
union

你可以參考
http://www.w3schools.com/sql/sql_join.asp
http://www.w3schools.com/sql/sql_union.asp

badboy01 iT邦新手 2 級 ‧ 2012-12-21 10:07:30 檢舉

大大您好!我使用大大的union,可以全部結合列出所有人員,但是資料會有重複現象(需要將重複資料結合),謝謝!

12
wiseguy
iT邦超人 1 級 ‧ 2012-12-21 01:25:14

SQL虛擬碼:

<pre class="c" name="code">
select A.員工,A.應休,A.應休-已休
from A left join
(select B.員工 as 休假人,sum(B.日數) as 已休 from B group by B.員工)
on A.員工=休假人
看更多先前的回應...收起先前的回應...
badboy01 iT邦新手 2 級 ‧ 2012-12-21 10:05:58 檢舉

大大您好!
SELECT afu_form_HR.ApplyerDeptName,HRperson,HRday,sum(HRdays)as UsedDay,(HRday-sum(HRdays))as UnusedDay
FROM afu_form_HR inner JOIN vacation on
afu_form_HR.Applyname=vacation.HRname where end_date Between '20120101' and '20121231' and Excuse='特休假'
group by afu_form_HR.ApplyerDeptName,HRperson,HRday

<pre class="c" name="code">

以上為結合資料表會產生有請特休的人員,A資料表(vacation)欄位只有全員名單(HRname)和應休天數(HRday),B資料表為(afu_form_HR),部門(ApplyerDeptName),請假天數(HRdays),現在只差無法全員列出有請和沒請特休假的人,謝謝!

badboy01 iT邦新手 2 級 ‧ 2012-12-21 10:18:07 檢舉

大大您好!或者我可以將(應休-已休)的結果寫到A資料表上,再從A資料表查詢結果,該怎麼做呢?這個方法好嗎?謝謝!

wiseguy iT邦超人 1 級 ‧ 2012-12-21 18:12:09 檢舉

不是已經寫了虛擬碼給你了?就代換成你的實際 TABLE 跟欄位就好了:

<pre class="c" name="code">select B.ApplyerDeptName,A.HRname,A.HRday,A.HRday-B.HRdaied
from vacation as A left join  
(select ApplyerDeptName,Applyname,sum(HRdays) as HRdaied from afu_form_HR group by Applyname) as B
on A.HRname=B.Applyname

其它日期與假別條件就請你自行加入了。

賽門 iT邦超人 1 級 ‧ 2012-12-21 19:00:52 檢舉

wiseguy提到:
不是已經寫了虛擬碼給你了?

很像我以前對一些不用心的程式設計師講話...搖頭

badboy01 iT邦新手 2 級 ‧ 2012-12-21 21:26:36 檢舉

萬分感謝大大提供資訊,願意耐心回覆小弟,已經可以成功跑出我要的結果了。

4
simon0627
iT邦新手 2 級 ‧ 2012-12-21 15:13:02

SELECT afu_form_HR.ApplyerDeptName,HRperson,HRday,sum(HRdays)as UsedDay,(HRday-sum(HRdays))as UnusedDay
FROM afu_form_HR inner JOIN vacation on
afu_form_HR.Applyname=vacation.HRname where end_date Between '20120101' and '20121231' and Excuse='特休假'<--指定了只取特休的 所以拿掉就全有了
group by afu_form_HR.ApplyerDeptName,HRperson,HRday

但不確定這是你要的資料
若你下的語法可取出你要的資料 則可用暫存資料表的方式進行後續處理
暫存資料表 參考語法
1.with temptable as(較耗記憶體資源)
2.create view temptable as
若資料量大建議採 create view 的方式
例如

&lt;pre class="c" name="code">create view temp as
SELECT afu_form_HR.ApplyerDeptName,HRperson,HRday,sum(HRdays)as UsedDay,(HRday-sum(HRdays))as UnusedDay
FROM afu_form_HR inner JOIN vacation on
afu_form_HR.Applyname=vacation.HRname where end_date Between '20120101' and '20121231' and Excuse='特休假'
group by afu_form_HR.ApplyerDeptName,HRperson,HRday

你在利用select temp 就能看到得到的結果了
但當view 不需使用 記得drop 掉 DROP VIEW temp 則將該表刪除

badboy01 iT邦新手 2 級 ‧ 2012-12-21 21:28:34 檢舉

謝謝大大意見,已經可以成功跑出結果。

2
Albert
iT邦高手 1 級 ‧ 2012-12-21 19:12:10

這樣問是 : 學校 [沒有指導教授]公司[沒有指導顧問]?

給你專業建議; 要有技術顧問; 否則進度嚴重落後; 薪資多花3-5倍; 夠請顧問了....

有要回雲林工作的同學嗎 ? SAP / B1 外掛程式
[學歷不拘 經驗不拘 體健耐超, 有耐心, 不抽菸不喝酒]
一周 2 - 3 天在斗六工業區

實習時薪 100元 200小時 2萬
試作時薪 200元 400小時 8萬
助理工程師時薪 300元 800小時 24萬
副工程師時薪 400元 1600小時 64萬
正工程師時薪 500元 3200小時 160萬
SAP / B1 外掛程式:: 有無經驗皆可

看更多先前的回應...收起先前的回應...
Albert iT邦高手 1 級 ‧ 2012-12-21 19:18:52 檢舉

badboy01提到:

我有A,B兩個資料表,
A資料表有所有15個員工的當年度所擁有的特休假數,
B資料表是員工請假的資料,
我用SQL語法將A,B兩表可以查詢出有請假的員工資料,
剩下幾天的特休假,
可是有一個問題,
假設明年度開始有些人還未請假,
所以用SQL語法查詢出的結果不會顯示出來,
我要怎麼做才能將A資料
...(恕刪)

SELECT a.*,b.*
FROM A資料表 a ---有所有15個員工的當年度所擁有的特休假數,
LEFT OUTER JOIN B資料表 b ON a.員工ID=b.員工ID ---是員工請假的資料,
................................................................

Albert iT邦高手 1 級 ‧ 2012-12-21 19:33:17 檢舉

MIS 不是 RD
MIS 只做 well-training 的事

顧問是 6小時, 領 MIS 6天工資 = 減少 MIS 延誤 6周的成本

badboy01 iT邦新手 2 級 ‧ 2012-12-21 21:29:33 檢舉

謝謝大大意見,已經可以成功跑出結果。

鐵殼心 iT邦高手 1 級 ‧ 2012-12-21 21:49:52 檢舉

albertachen提到:
顧問是 6小時, 領 MIS 6天工資 = 減少 MIS 延誤 6周的成本

讚

我要發表回答

立即登入回答