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

如何把資料按照月份歸檔
前往頁面 1, 2  下一頁
 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
sthuang66



註冊時間: 2014-04-27
文章: 171


第 1 樓

發表發表於: 星期日 十月 26, 2014 3:22 pm    文章主題: 如何把資料按照月份歸檔 引言回覆

想把六個月的業績按照月份排好該如何寫比較精簡? 請教各位高手
原始資料舉例如下(原始資料比數較多!先舉四個來說明
ID YM NO
a 201401 9
a 201403 8
a 201404 1
a 201406 2
b 201401 5
b 201406 10
c 201401 7
c 201402 11
c 201403 2
c 201404 5
c 201405 17
c 201406 13
d 201403 8
d 201405 16
d 201401 4
----------------------------------------
想整理成下面格式
ID 一月(JAN) 二月(FEB) 三月(MAR) 四月(APR) 五月(MAY) 六月(JUN)
a 9 0 8 1 0 2
b 5 0 0 0 0 10
c 7 11 2 5 17 13
d 4 0 8 0 16 0
------------------------------------------------------------------------------------
我方法是把他們按照月份算出六個月份分別檔案C1~C6
回頂端
檢視會員個人資料 發送私人訊息
sthuang66



註冊時間: 2014-04-27
文章: 171


第 2 樓

發表發表於: 星期日 十月 26, 2014 4:01 pm    文章主題: 引言回覆

資料庫檔名aaa
YM='201401'
Y=VAL(SUBSTR(YM,1,4))
M=VAL(SUBSTR(YM,5,2))
FOR I = 1 TO 6
J=ALLTRIM(STR(I))
NYM=STR(Y,4,0)++PADL(ALLTRIM(STR(M,2,0)),2,'0')
SELECT ID ,NO FROM aaa WHERE YM=NYM INTO TABLE TEMP
COPY FILE TEMP.DBF TO 'C'+J+'.dbf'
ERASE TEMP.DBF
CLOSE DATABASE ALL
M=M+1
IF M>=13
M=1
Y=Y+1
ENDIF
ENDFOR
------------------------------------------------------------------------------
這樣C1~C6就是每個月份的業績,再把六個月裝起來
------------------------------------------------------------------------------
SELECT ID FROM C1 UNION SELECT ID FROM C2 UNION SELECT ID FROM C3 UNION SELECT ID FROM C4 UNION SELECT ID FROM C5 UNION SELECT ID FROM C6 INTO TABLE K
SELECT A.ID,CAST(NVL(JAN,0) AS N(4)) JAN,CAST(NVL(FEB,0) AS N(4)) FEB,CAST(NVL(MAR,0) AS N(4)) MAR,CAST(NVL(APR,0) AS N(4)) APR,CAST(NVL(MAY,0) AS N(4)) MAY,CAST(NVL(JUN,0) AS N(4)) JUN;
FROM K A LEFT JOIN C1 B On A.ID==B.ID LEFT JOIN C2 C On A.ID==C.ID LEFT JOIN C3 D On A.ID==D.ID LEFT JOIN C4 E On A.ID==E.ID LEFT JOIN C5 F On A.ID==F.ID LEFT JOIN C6 G On A.ID==G.ID;
INTO TABLE 業績
QUIT
------------------------------------------------------------------------------
不過我在裝六個檔之前!有點小麻煩!就是要把每個月份的欄位名"NO"先更名成不一樣的!就像我上面寫的我C1(201401)檔中NO改成JAN!二月改成FEB
請教各位高手有什麼辦法可以把更名的步驟快一點?
我目前是用vfp的精靈中MODIFY STRUCTURE把每個月的NO更改成不一樣
另一個就是用
SELECT ID,NO AS JAN FROM C1 INTO TABLE D1
SELECT ID,NO AS FEB FROM C2 INTO TABLE D2
SELECT ID,NO AS MAR FROM C3 INTO TABLE D3
SELECT ID,NO AS APR FROM C4 INTO TABLE D4
SELECT ID,NO AS MAY FROM C5 INTO TABLE D5
SELECT ID,NO AS JUN FROM C6 INTO TABLE D6
------------------------------------------------------------------------------
請教各位賜教!!! 因為sql語法更動欄位名不能用迴圈區處理
本想用
FOR I = 1 TO 6
J=ALLTRIM(STR(I))
SELECT ID ,NO AS M'+J+' FROM C'+J+' INTO TABLE TEMP
COPY FILE TEMP.DBF TO 'D'+J+'.dbf'
ERASE TEMP.DBF
CLOSE DATABASE ALL
M=M+1
ENDFOR
----------------------------------------------------------------------------
以上我試過是不行!可能我不是專業訓練程式員所以對SQL了解不深!所以寫出怪怪的程式步驟!
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1644


第 3 樓

發表發表於: 星期日 十月 26, 2014 4:23 pm    文章主題: 引言回覆

只要一行 Sql 指令即可
代碼:

Select Id ,;
    sum(一月) AS 一月,;
    sum(二月) AS 二月,;
    sum(三月) AS 三月,;
    sum(四月) AS 四月,;
    sum(五月) AS 五月,;
    sum(六月) AS 六月 ;
from (;
    Select Id,;
        iif(Month='01',No,0000000000) AS 一月,;
        iif(Month='02',No,0000000000) AS 二月,;
        iif(Month='03',No,0000000000) AS 三月,;
        iif(Month='04',No,0000000000) AS 四月,;
        iif(Month='05',No,0000000000) AS 五月,;
        iif(Month='06',No,0000000000) AS 六月;
    From (;
        Select Id,Right(YM,2) AS Month , sum(No) AS No ;
    from aaa ;
    group by 1,2) a ) b ;
group by id
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
sthuang66



註冊時間: 2014-04-27
文章: 171


第 4 樓

發表發表於: 星期日 十月 26, 2014 10:11 pm    文章主題: 引言回覆

謝謝ckp6250的指導,可以用了!! 很感謝不吝賜教
這樣的SQL語法第一次見識到!!
我才剛學不久!
回頂端
檢視會員個人資料 發送私人訊息
sthuang66



註冊時間: 2014-04-27
文章: 171


第 5 樓

發表發表於: 星期日 十月 26, 2014 10:24 pm    文章主題: 引言回覆

請教ckp6250
iif(Month='01',No,0000000000) AS 一月 的敘述一定要十個0嗎
回頂端
檢視會員個人資料 發送私人訊息
sthuang66



註冊時間: 2014-04-27
文章: 171


第 6 樓

發表發表於: 星期二 十月 28, 2014 4:26 pm    文章主題: 引言回覆

請教各位高手
上面的程式順序在VFP 8.0會出現syntax error
但是在9.0卻不會
因為在家裡用9.0試可以!回到公司因為版權關係是8.0居然會出現syntax error
好怪
回頂端
檢視會員個人資料 發送私人訊息
sthuang66



註冊時間: 2014-04-27
文章: 171


第 7 樓

發表發表於: 星期二 十月 28, 2014 6:07 pm    文章主題: 引言回覆

把上面一行SQL拆成 3行在VFP 8.0就可以運行!
可能是8.0看不懂短到"該邊"的程序!!!!
回頂端
檢視會員個人資料 發送私人訊息
syntech



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

第 8 樓

發表發表於: 星期三 十月 29, 2014 9:25 am    文章主題: 引言回覆

SQL 引擎不一樣.

VFP 9 :
SET ENGINEBEHAVIOR 70 | 80 | 90

等價於
SYS(3099 [, 70 | 80 | 90])


可以切換 3種 SQL 引擎處理行為.



---
ckp6250 兄通常給的都是 VFP9 的SQL 命令. Evil or Very Mad

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

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



註冊時間: 2011-12-25
文章: 127


第 9 樓

發表發表於: 星期日 十一月 02, 2014 11:26 am    文章主題: 引言回覆

代碼:
Create Cursor Tt (Id C(1),Ym C(6),No N(2))
Insert Into Tt Values ("a","201401",9)
Insert Into Tt Values ("a","201403",8)
Insert Into Tt Values ("a","201404",1)
Insert Into Tt Values ("a","201406",2)
Insert Into Tt Values ("b","201401",5)
Insert Into Tt Values ("b","201406",10)
Insert Into Tt Values ("c","201401",7)
Insert Into Tt Values ("c","201402",11)
Insert Into Tt Values ("c","201403",2)
Insert Into Tt Values ("c","201404",5)
Insert Into Tt Values ("c","201405",17)
Insert Into Tt Values ("c","201406",13)
Insert Into Tt Values ("d","201403",8)
Insert Into Tt Values ("d","201405",16)
Insert Into Tt Values ("d","201401",4)

Select Id,Padl(Sum(Iif(Right(Ym,2)=="01",No,0)),2,"0") 一月,;
Padl(Sum(Iif(Right(Ym,2)=="02",No,0)),2,"0") 二月,;
Padl(Sum(Iif(Right(Ym,2)=="03",No,0)),2,"0") 三月,;
Padl(Sum(Iif(Right(Ym,2)=="04",No,0)),2,"0") 四月,;
Padl(Sum(Iif(Right(Ym,2)=="05",No,0)),2,"0") 五月,;
Padl(Sum(Iif(Right(Ym,2)=="06",No,0)),2,"0") 六月  From Tt Group By Id Into Cursor Temp ReadWrite
For lnI=2 To Fcount()
    If Type(Field(lnI))="C"
       Blank All Fields (Field(lnI)) For Evaluate(Field(lnI))=="00"
    EndIf 
EndFor
Browse
[/code]
回頂端
檢視會員個人資料 發送私人訊息
perry



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


第 10 樓

發表發表於: 星期日 十一月 02, 2014 1:07 pm    文章主題: 引言回覆

拆成2個SQL就可不管版本!!為了不想寫太多0所以用sum(xx+0)
要小數點1位就 sum(xx+0.0) as ... or sum(xx)+0.0 as...
代碼:

sele id,ym,left(ym,4) as ye,sum(iif(righ(ym,2)='01',no,0)+0) as mo01,;
  sum(iif(righ(ym,2)='02',no,0)+0) as mo02,;
  sum(iif(righ(ym,2)='03',no,0)+0) as mo03,;
  sum(iif(righ(ym,2)='04',no,0)+0) as mo04,;
  sum(iif(righ(ym,2)='05',no,0)+0) as mo05,;
  sum(iif(righ(ym,2)='06',no,0)+0) as mo06 ;
  from aaa grou by id,ym into curs test_a

sele id,ye,sum(mo01+0) as mo01,;
  sum(mo02+0) as mo02,;
  sum(mo03+0) as mo03,;
  sum(mo04+0) as mo04,;
  sum(mo05+0) as mo05,;
  sum(mo06+0) as mo06 ;
  from test_a grou by id,ye into curs test_b
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1644


第 11 樓

發表發表於: 星期一 十一月 03, 2014 4:38 pm    文章主題: 引言回覆

sthuang66 寫到:
請教ckp6250
iif(Month='01',No,0000000000) AS 一月 的敘述一定要十個0嗎


親手試,最實在,
您不妨把10個0改成1個0
跑看看就知道啦 Laughing
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
ckp6250



註冊時間: 2004-07-30
文章: 1644


第 12 樓

發表發表於: 星期一 十一月 03, 2014 4:41 pm    文章主題: 引言回覆

syntech 寫到:

ckp6250 兄通常給的都是 VFP9 的SQL 命令. Evil or Very Mad


用了9.0之後
再也回不去了
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
ckp6250



註冊時間: 2004-07-30
文章: 1644


第 13 樓

發表發表於: 星期一 十一月 03, 2014 4:44 pm    文章主題: 引言回覆

perry 寫到:
拆成2個SQL就可不管版本!!為了不想寫太多0所以用sum(xx+0)
要小數點1位就 sum(xx+0.0) as ... or sum(xx)+0.0 as...


也許不止小數點問題吧,
幾個0可能有用途
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
lygcw9603



註冊時間: 2011-12-25
文章: 127


第 14 樓

發表發表於: 星期一 十一月 03, 2014 11:53 pm    文章主題: 引言回覆

0000000000代表KUAN度
回頂端
檢視會員個人資料 發送私人訊息
perry



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


第 15 樓

發表發表於: 星期二 十一月 04, 2014 6:47 pm    文章主題: 引言回覆

當您的欄位有小數點時, sele sum(xx) as ... 會依第1筆資料建立新欄位的.
第1筆是整數 vfp 會將全部記錄自動四捨五入成整數加總...生成的欄位就是整數!!

所以當您的欄位小數點2位 sele sum(xx+0.00) as ... 可使 sql 正常加總 .
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
前往頁面 1, 2  下一頁
1頁(共2頁)

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


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