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

請教在同一個table 要做篩選後及 UNION的問題...

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



註冊時間: 2006-02-10
文章: 1


第 1 樓

發表發表於: 星期五 二月 10, 2006 11:21 am    文章主題: 請教在同一個table 要做篩選後及 UNION的問題... 引言回覆

假設在 A 的TABLE裡

名稱 數量  總金額    日期
甲  1  10   20060210
乙  2  40   20060210
丙  3  60   20060210
丁  4  160  20060210
(實際上依日期不同會不只四筆資料,目前假設只有四筆
)

如果我要下 SQL 語法挑出資料(不更新、修改原先的資料)
名稱 數量  總金額    日期
戊  3  50   20060210
丙  3  60   20060210
丁  4  160  20060210


我現在下的是先挑出甲加乙,將名稱命名為戊的
SELECT '戊' 名稱,SUM(數量) 數量,SUM(總金額) 總金額
FROM A
WHERE 日期 = TO_DATE(20060210,'YYYYMMDD')
AND (名稱='甲' OR 名稱='乙')
GROUP BY '戊'

另外挑出不含甲、乙的

SELECT 名稱,SUM(數量) 數量,SUM(總金額) 總金額
FROM A
WHERE 日期 = TO_DATE(20060210,'YYYYMMDD')
AND 名稱<>'甲'
AND 名稱<>'乙'
GROUP BY '名稱'

以上兩個語法我分別試過,都可以成功挑出資料
但我在將兩個挑出來的資料做UNION的時候就不行
直接這樣下↓

SELECT '戊' 名稱,SUM(數量) 數量,SUM(總金額) 總金額
FROM A
WHERE 日期 = TO_DATE(20060210,'YYYYMMDD')
AND (名稱='甲' OR 名稱='乙')
GROUP BY '戊'
UNION
SELECT 名稱,SUM(數量) 數量,SUM(總金額) 總金額
FROM A
WHERE 日期 = TO_DATE(20060210,'YYYYMMDD')
AND 名稱<>'甲'
AND 名稱<>'乙'
GROUP BY '名稱'
但是在執行的時候就會有錯@@
會出現 expression must have same datatype as corresponding expression
我有嘗試將下面的語法中的 名稱 及group by修改成'戊'
雖然可以挑出資料,但它會將甲、乙的加在一起,也把丙、丁的加在一起了
就不是我想要的資料
請問有辦法成功挑出來嗎....
回頂端
檢視會員個人資料 發送私人訊息
bin1x



註冊時間: 2004-08-27
文章: 462


第 2 樓

發表發表於: 星期五 二月 10, 2006 7:28 pm    文章主題: 引言回覆

我曾遇過這種情況啦
經過好幾次的sql
尤其有用sum()做的,
後面的會突然多1位
而無法union,別說你覺得不合理,我也是
我的怪招是
代碼:

SELECT TMP1.OD_SALNO,SMP1.P_NAME,TMP1.CU_NO,SMP1.CU_SNAME,TMP1.OD_NO,SMP1.OD_NAME,SMP1.P_SALE,TMP1.SUM_QTY;
FROM TMP1,SMP1;
WHERE TMP1.OD_SALNO = SMP1.OD_SALNO AND;
      TMP1.CU_NO = SMP1.CU_NO AND;
      TMP1.OD_NO = SMP1.OD_NO ;
      INTO CURSOR OBJ1

SELECT TMP1.OD_SALNO,PERSON.P_NAME,TMP1.CU_NO,CUSTOM.CU_SNAME,TMP1.OD_NO,ORDER.OD_NAME,0000000000,TMP1.SUM_QTY;
FROM TMP1,PERSON,CUSTOM,ORDER;
WHERE TMP1.OD_SALNO = PERSON.P_NUM AND;
      TMP1.CU_NO = CUSTOM.CU_NO AND;
      TMP1.OD_NO = ORDER.OD_NO AND;
      TMP1.OD_SALNO+TMP1.CU_NO+TMP1.OD_NO NOT IN (SELECT OD_SALNO+CU_NO+OD_NO FROM OBJ1);
      INTO CURSOR OBJ2

SELECT SMP1.OD_SALNO,SMP1.P_NAME,SMP1.CU_NO,SMP1.CU_SNAME,SMP1.OD_NO,SMP1.OD_NAME,SMP1.P_SALE,000000000000.000;
FROM SMP1;
WHERE SMP1.OD_SALNO+SMP1.CU_NO+SMP1.OD_NO NOT IN (SELECT OD_SALNO+CU_NO+OD_NO FROM OBJ1) AND;
      SMP1.OD_SALNO+SMP1.CU_NO+SMP1.OD_NO NOT IN (SELECT OD_SALNO+CU_NO+OD_NO FROM OBJ2);
      INTO CURSOR OBJ3
SELECT * FROM OBJ1 UNION ALL;
SELECT * FROM OBJ2 UNION ALL;
SELECT * FROM OBJ3 INTO CURSOR TMP2

其中那個00000000.000 就是怪招,把它位數定起來
沒辦法,怪問題就用怪招
現在想起來,還是覺得不合理,而且我找到的這個還"只有"兩個sql 就出問題了
我曾想過是不是和decimal 有關,好像無關吧
再說了,你的訊息似乎和資料型態有關,而不是位數不同無法union
我想起來了,再補充一下
有兩個sum()函數當union 起來,再作group by 時
可能怕有溢位,所以結合的結果好像會自動多一位出來,在統計銷售數字時
就常碰到
所以會有位數不合,至於型態不合,沒碰過
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件 參觀發表人的個人網站 MSN Messenger
yoncen



註冊時間: 2005-08-29
文章: 31
來自: 爪哇島

第 3 樓

發表發表於: 星期五 十二月 04, 2009 8:44 pm    文章主題: 引言回覆

SELECT 名稱,SUM(數量) 數量,SUM(總金額) 總金額
FROM A
WHERE 日期 = TO_DATE(20060210,'YYYYMMDD')
AND 名稱<>'甲'
AND 名稱<>'乙'
GROUP BY 名稱
UNION ALL
SELECT '戊' AS 名稱,SUM(數量) 數量,SUM(總金額) 總金額
FROM A
WHERE 日期 = TO_DATE(20060210,'YYYYMMDD')
AND (名稱='甲' OR 名稱='乙')

位置调换一下,因为vfp会将第一个select中的字段做为默认宽度。

_________________
The early bird catches the worm...
--yoncen copyright(c) 2001-2005
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站 MSN Messenger
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> SQL 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

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


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