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

SELECT - SQL 搞不懂它的 GROUP BY

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
jerryclt



註冊時間: 2009-03-10
文章: 334
來自: 佛心來的

第 1 樓

發表發表於: 星期二 四月 19, 2011 7:29 am    文章主題: SELECT - SQL 搞不懂它的 GROUP BY 引言回覆

SELECT * FROM or01 WHERE or01_001='211104' GROUP BY or01_001 ORDER BY or01_001 INTO CURSOR _tmpf

在VFP 6.0是OK的
在VFP 9.0得到 SQL: GROUP BY clause is missing or invalid.

請教是發生何事?
回頂端
檢視會員個人資料 發送私人訊息
pilipala



註冊時間: 2009-05-13
文章: 75


第 2 樓

發表發表於: 星期二 四月 19, 2011 7:35 am    文章主題: 引言回覆

FROM 9.0 Help ~~

GROUP BY 子句指定一個或多個用來分組查詢傳回資料記錄的欄位。欄位參考自 SQL SELECT 敘述清單,除累計式運算式之外,必須包含在 GROUP BY 子句中。不能對附註型態欄位、通用型態欄位或二進位大型物件型態欄位進行分組。
回頂端
檢視會員個人資料 發送私人訊息
jerryclt



註冊時間: 2009-03-10
文章: 334
來自: 佛心來的

第 3 樓

發表發表於: 星期二 四月 19, 2011 7:39 am    文章主題: 引言回覆

pilipala 寫到:
FROM 9.0 Help ~~

GROUP BY 子句指定一個或多個用來分組查詢傳回資料記錄的欄位。欄位參考自 SQL SELECT 敘述清單,除累計式運算式之外,必須包含在 GROUP BY 子句中。不能對附註型態欄位、通用型態欄位或二進位大型物件型態欄位進行分組。


Help裡的說明有點給他看不懂,
or01_001是一個字串欄位,
並非附註型態欄位、通用型態欄位或二進位大型物件型態欄位這三種型態,
我只知如果改成:
SELECT or01_001 FROM or01 WHERE or01_001='211104' GROUP BY or01_001 ORDER BY or01_001 INTO CURSOR _tmpf
是可以的,
但是...or01.dbf裡有數百個欄位都要抓出來時,
不是頭粉大?
回頂端
檢視會員個人資料 發送私人訊息
pilipala



註冊時間: 2009-05-13
文章: 75


第 4 樓

發表發表於: 星期二 四月 19, 2011 8:02 am    文章主題: 引言回覆

引言回覆:

SELECT Col1,Col2,SUM(Col3) AS Col1
FROM DBF
GROUP BY Col1,Col2


Help 的意思簡單說是
SELECT 的欄位,假如沒有應用到 彙總函數(EX:SUM()、MAX() .....等),就必須包含在GROUP BY 內 ~~
回頂端
檢視會員個人資料 發送私人訊息
jerryclt



註冊時間: 2009-03-10
文章: 334
來自: 佛心來的

第 5 樓

發表發表於: 星期二 四月 19, 2011 8:16 am    文章主題: 引言回覆

pilipala 寫到:
引言回覆:

SELECT Col1,Col2,SUM(Col3) AS Col1
FROM DBF
GROUP BY Col1,Col2


Help 的意思簡單說是
SELECT 的欄位,假如沒有應用到 彙總函數(EX:SUM()、MAX() .....等),就必須包含在GROUP BY 內 ~~


GROUP BY - 顧名思義乃分組之義,
在幾十個或上百個欄位中,不可能全部拿來當分組欄位用,
正常只是拿1,2個欄位來分組,
SELECT Col1,Col2,Col3,Col4,Col5,...,Col98,Col99...
像這樣的SQL怎麼會要求GROUP BY 99個欄位?
真是怪哉 = ="

只好 SET ENGINEBEHAVIOR 70 了 >"<
回頂端
檢視會員個人資料 發送私人訊息
heetee



註冊時間: 2010-11-20
文章: 16


第 6 樓

發表發表於: 星期二 四月 19, 2011 5:19 pm    文章主題: 引言回覆

偶記得在vfp9是不能用select * ...的
若要用select * ...只好 SET ENGINEBEHAVIOR 70 了
回頂端
檢視會員個人資料 發送私人訊息
小桑•無痕



註冊時間: 2003-07-08
文章: 304
來自: Tainan, Taiwan

第 7 樓

發表發表於: 星期三 四月 20, 2011 9:31 am    文章主題: 引言回覆

VFP 9.0 用的 SQL語法 比較嚴謹
_________________
用力 Try 一下...可以發現很多好玩的事....
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
syntech



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

第 8 樓

發表發表於: 星期三 四月 20, 2011 9:41 am    文章主題: 引言回覆

vfp 7.0 以前的 sql 命令離標準 sql 的距離很遠.
這對同時使用 SPT 操作遠端資料庫也會造成不好的影響.
VFP 8/9 才改的離標準 sql 近一點.


不過我還是習慣用標準sql的語法.
就像之前 into table 到底應該放在哪裡的問題一樣. XD

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

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



註冊時間: 2003-07-08
文章: 304
來自: Tainan, Taiwan

第 9 樓

發表發表於: 星期三 四月 20, 2011 9:45 am    文章主題: 引言回覆

syntech 寫到:
vfp 7.0 以前的 sql 命令離標準 sql 的距離很遠.
這對同時使用 SPT 操作遠端資料庫也會造成不好的影響.
VFP 8/9 才改的離標準 sql 近一點.


不過我還是習慣用標準sql的語法.
就像之前 into table 到底應該放在哪裡的問題一樣. XD


+1

_________________
用力 Try 一下...可以發現很多好玩的事....
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 雅虎訊息通 MSN Messenger
lzm



註冊時間: 2006-02-14
文章: 8
來自: 北京

第 10 樓

發表發表於: 星期四 四月 28, 2011 4:11 pm    文章主題: 引言回覆

VFP8的group 使用体会:
一些在vfp7以下版本编制的 group 语句 ,往往在vfp8中 报错。
解决的办法,可以用下列两种方式之一:
1. SYS(3099,70)
2. SET ENGINEBEHAVIOR 70
但如果不想这样,就要注意符合vfp8的语句规则:
*!* 有如下数据:l.dbf
*!* bm lx je
*!* 外科 药费 1.01
*!* 外科 手术 2.02
*!* 内科 药费 3.03
*!* 儿科 检查 4.04
在vfp8以下,求分科的金额合计 可以这样:
SELECT bm,sum(je) FROM l GROUP BY bm
结果:
儿科 4.04
内科 3.03
外科 3.03
注意两点:
1。在group by 后的分组字段,必须在 select 中 出现(如 bm )
2。select 后 除分组字段外的其它字段,必须用 sum 求和(或 用 count 求记录数)
要想求交叉表,可用以下语句:
SELECT bm,sum(IIF(lx='药费',je,0)),sum(IIF(lx='手术',je,0)),sum(IIF(lx='检查',je,0)) FROM l GROUP BY bm
结果:
儿科 0.00 0 4
内科 3.03 0 0
外科 1.01 2 0
但这样求出的结果,除一项外,其他lx会丢失小数点后的数据,应该改为:
SELECT bm,sum(IIF(lx='药费',je,0.00)),sum(IIF(lx='手术',je,0.00)),sum(IIF(lx='检查',je,0.00)) FROM l GROUP BY bm
结果:
儿科 0.00 0.00 4.04
内科 3.03 0.00 0.00
外科 1.01 2.02 0.00
其原因在于:产生的交叉表的数据格式,以该组第一次遇到的数据格式为准。狐友不妨试试。
当lx各项数量不确定时(药费,手术,检查,治疗,。。。),可以采用拼接的方式,来组织 select 后的 语句,就可以灵活求出 交叉表了。
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 MSN Messenger
qq620414



註冊時間: 2010-06-26
文章: 1


第 11 樓

發表發表於: 星期三 六月 29, 2011 10:58 pm    文章主題: 引言回覆

加上sys(3099,70)即可
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

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


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