VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

sql語法產生首尾筆的問題
前往頁面 1, 2, 3, 4, 5  下一頁
 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 1 樓

發表發表於: 星期三 九月 06, 2017 3:11 pm    文章主題: sql語法產生首尾筆的問題 引言回覆

各位先進大家好, 我有一個複雜的問題
我有一個考勤記錄, 資料如下

刷卡日期, 刷卡時間, 刷卡狀態, 門禁卡號, 部門名稱, 員工姓名, 員工編號, 部門編號, 卡機編號, 通訊埠, 卡機名稱, 職稱編號, 星期
20170801,07:35,0,07610530, 運籌部, 林老師,00001,0000000007,01,00005, 考勤卡機,0000000010,2
20170801,08:35,正,07610530, 運籌部, 林老師,00001,0000000007,02,00005, 門禁卡機,0000000010,2
20170801,18:09,1,07610530, 運籌部, 林老師,00001,0000000007,01,00005, 考勤卡機,0000000010,2
20170802,17:32,1,07610530, 運籌部, 林老師,00001,0000000007,01,00005, 考勤卡機,0000000010,3
20170803,07:34,0,07610530, 運籌部, 林老師,00001,0000000007,01,00005, 考勤卡機,0000000010,4
20170803,17:39,1,07610530, 運籌部, 林老師,00001,0000000007,01,00005, 考勤卡機,0000000010,4

這是第一個問題
我現在用 SQL 語法, 想要抓出首尾筆, 但遇到一個狀況
例:
20170802 只有下班刷卡(紅色列), 沒有上班刷卡, 抓出來的資料上班時間會和下班時間一樣(圖一),


但我希望是空白(圖二), 現在我是用迴圈來處理

請問 sql 能直接產生空白嗎? 還是我個人想太多了??能不能請各位先進指點一下??

附上處理的程式, 我是用到子查詢 min() 產生首筆, max()產生尾筆
http://vfp.sunyear.com.tw/files/test_768.prg

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 2 樓

發表發表於: 星期三 九月 06, 2017 3:44 pm    文章主題: 引言回覆

直覺是 LEFT OUTER JOIN


話說,
早退及遲到的定義很模糊吧.

可能會是像這樣,沒測試:
代碼:


*產生刷卡首尾筆
SELECT DISTINCT 刷卡日期, 門禁卡號 INTO CURSOR SKSDB2 FROM HR001_TMP 

SELECT 刷卡日期, 門禁卡號, MIN(刷卡時間) AS 上班 INTO CURSOR A FROM HR001_TMP WHERE 刷卡時間 <'13:00' GROUP BY 刷卡日期, 門禁卡號

SELECT 刷卡日期, 門禁卡號, MAX(刷卡時間) AS 下班 INTO CURSOR B FROM HR001_TMP WHERE 刷卡時間 >='13:00' GROUP BY 刷卡日期, 門禁卡號

*合併資料
SELECT SKSDB2.刷卡日期, SKSDB1.門禁卡號, SKSDB1.門禁卡號 AS HRM卡號, SKSDB1.員工編號, SKSDB1.員工姓名, SKSDB1.部門編號, SKSDB1.部門名稱, SKSDB1.職稱編號, ;
IIF(ISNULL(A.上班),'     ',A.上班) AS 上班時間, IIF(ISNULL(B.下班),'     ',B.下班) AS 下班時間, SKSDB0.星期, SKSDB0.星期別 ;
FROM SKSDB2 ;
LEFT JOIN A ON SKSDB2.刷卡日期 = A.刷卡日期 AND  SKSDB2.門禁卡號 = A.門禁卡號 ;
LEFT JOIN B ON SKSDB2.刷卡日期 = B.刷卡日期 AND  SKSDB2.門禁卡號 = B.門禁卡號 ;
INNER JOIN SKSDB1 ON SKSDB1.門禁卡號 = SKSDB2.門禁卡號 ;
INNER JOIN SKSDB0 ON SKSDB2.刷卡日期 = SKSDB0.刷卡日期 ;

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 3 樓

發表發表於: 星期三 九月 06, 2017 4:08 pm    文章主題: 引言回覆

syntech 寫到:
直覺是 LEFT OUTER JOIN


話說,
早退及遲到的定義很模糊吧.


s大, 您說對了, 因為不能產生空白, 所以用下班 <="12:59" 是表示, 下班沒刷
上班>="13:00" 是上班沒刷, 但這樣應該遲早會出事

left outer join 不能用兩個子查詢,
如果當日, 只有一筆, 若分開使用 min(), 會被視為最小, 相同的, 如果是 max(), 會被視為最大, 於是就發生我說的問題, 上下班刷卡會相等

看來只能用您的程式碼最簡潔有力, 只能用這樣處理了, 謝謝您的指導

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 4 樓

發表發表於: 星期三 九月 06, 2017 4:15 pm    文章主題: 引言回覆

有人說 vfp 9 以前最多 join 9 個 cursor, vfp 9 以後沒限制,
但我沒測試過.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 5 樓

發表發表於: 星期三 九月 06, 2017 4:19 pm    文章主題: 引言回覆

邏輯完整,程式不一定簡潔.

算錢的東西,我喜歡用迴圈慢慢填空.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 6 樓

發表發表於: 星期三 九月 06, 2017 4:24 pm    文章主題: 引言回覆

syntech 寫到:
有人說 vfp 9 以前最多 join 9 個 cursor, vfp 9 以後沒限制,
但我沒測試過.


s大, 抱歉, 我沒說清楚, left outer join 不能用是指我的程式碼, 不是你的程式碼
呵呵

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 7 樓

發表發表於: 星期三 九月 06, 2017 4:25 pm    文章主題: 引言回覆

syntech 寫到:
邏輯完整,程式不一定簡潔.

算錢的東西,我喜歡用迴圈慢慢填空.


比較不會出錯嗎? 還是有其他原因, 可否讓我學學~~
程式跑久一點, 客戶比較有成就感嗎? 呵呵

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 8 樓

發表發表於: 星期三 九月 06, 2017 4:57 pm    文章主題: 引言回覆

因為我 sql 沒學好. ^.^

要寫到cursor不會多幾筆少幾筆,速度快,使用資源少的sql命令好難.

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
perry



註冊時間: 2014-07-20
文章: 203


第 9 樓

發表發表於: 星期三 九月 06, 2017 6:29 pm    文章主題: 引言回覆

多加一個累計打卡次數 sum(1) as dkno
再一次 sele 判斷 應可解決
回頂端
檢視會員個人資料 發送私人訊息
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 10 樓

發表發表於: 星期四 九月 07, 2017 10:15 am    文章主題: 引言回覆

syntech 寫到:
因為我 sql 沒學好. ^.^

要寫到cursor不會多幾筆少幾筆,速度快,使用資源少的sql命令好難.


哈哈哈, s大難得幽默啊~~

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 11 樓

發表發表於: 星期四 九月 07, 2017 10:24 am    文章主題: 引言回覆

perry 寫到:
多加一個累計打卡次數 sum(1) as dkno
再一次 sele 判斷 應可解決


p大, 不好意思, SUM(1) 是什麼原理? 第一次看到
另外, 雖然加了 SUM(1) 但是MIN()或MAX()還是會抓到當日刷的一筆, 還是我誤解你的意思了??

S大的方式, 我還沒試, 因為昨天下班了, 呵呵

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
syntech



註冊時間: 2003-05-16
文章: 4211
來自: Taipei,Taiwan

第 12 樓

發表發表於: 星期四 九月 07, 2017 12:00 pm    文章主題: 引言回覆

GOOGLE 說 SUM(1) = COUNT(*)

COUNT(*) + GROUP BY = 累計打卡次數.
奇數表示有漏打卡,
但不知道漏打到班還是漏打下班.
如果薪資計算到小時,那就有的吵了.

---
應該要像好來屋電影,
漏打卡就警鈴大作,保全壓制在地. XD

_________________
如果公司有下列困擾:
1. 找不到便宜,快速,簡易的 生產排程軟體
2. 不知道如何快速排定 採購計劃
3. 成本抓不準,自己算比軟體算有用
4. 想學習系統規劃,想找系統架構的顧問

請聯絡我們,也許我們幫得上忙
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 AIM Address
perry



註冊時間: 2014-07-20
文章: 203


第 13 樓

發表發表於: 星期四 九月 07, 2017 5:01 pm    文章主題: 引言回覆

sele 0
sele 日期,卡號,sum(1) as 累計打卡,min(打卡時間) as 上班,max(打卡時間) as 下班
from test1 grou by 日期,卡號 into curs test_1
sele 0
sele 日期,卡號,iif(累計打卡=1 and 上班>='13:00',spac(5),上班) as 上班,
iif(累計打卡=1 and 下班<'13:00',spac(5),下班) as 下班 from test_1 into cus test_2
其實看您資料應該很好判斷
刷卡狀態0是上班,1是下班
排序後用 scan 來一筆筆填
回頂端
檢視會員個人資料 發送私人訊息
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 14 樓

發表發表於: 星期五 九月 08, 2017 1:52 pm    文章主題: 引言回覆

perry 寫到:
sele 0
sele 日期,卡號,sum(1) as 累計打卡,min(打卡時間) as 上班,max(打卡時間) as 下班
from test1 grou by 日期,卡號 into curs test_1
sele 0
sele 日期,卡號,iif(累計打卡=1 and 上班>='13:00',spac(5),上班) as 上班,
iif(累計打卡=1 and 下班<'13:00',spac(5),下班) as 下班 from test_1 into cus test_2
其實看您資料應該很好判斷
刷卡狀態0是上班,1是下班
排序後用 scan 來一筆筆填


謝謝p大的指導, 我以為 min() 和 max() 不能下在同一列, 又學習到了
我再看看能不能把您的程式碼整合進來, 縮減程式碼, 目前我是採用 s大的程式碼

目前刷卡狀態是0, 1沒錯, 但未來會有一個"正"的狀態, 所以就不再能用0,1 , 只能用首尾筆了
例如有個人
上班刷卡資料是: 20170908,00001111,0,07:40
下班刷卡資料是: 20170908,00001111,正,17:20
因為考勤機只能有一台, 沒法全部設成考勤機模式 (程式+刷卡機硬體的問題)
所以會將所有門禁卡機 + 考勤考機的資料下載合併

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
goodnight



註冊時間: 2008-10-13
文章: 472
來自: 台南市

第 15 樓

發表發表於: 星期五 九月 08, 2017 2:00 pm    文章主題: 引言回覆

syntech 寫到:
GOOGLE 說 SUM(1) = COUNT(*)

COUNT(*) + GROUP BY = 累計打卡次數.
奇數表示有漏打卡,
但不知道漏打到班還是漏打下班.
如果薪資計算到小時,那就有的吵了.

---
應該要像好來屋電影,
漏打卡就警鈴大作,保全壓制在地. XD


謝謝s大的指導,
薪資的確是算到小時, 但我忘了規則, 不過漏刷卡是小問題, 就直接扣錢, 所以有人遲到太久, 就不刷卡, 直接填忘刷單, 請主管核簽給人事, 只扣少少的錢, 很划算, 但是如果此員工不得主管疼愛, 就只能請事假了, 呵呵呵

_________________
希望有更多人來參與
VFP wiki - 需要大家一起完成的VFP電子書與FAQ
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
前往頁面 1, 2, 3, 4, 5  下一頁
1頁(共5頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作