線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1133
推到 Plurk!
推到 Facebook!

怎麼同時計算出二個不同時間點的數據

答題得分者是:st33chen
cindyliu
一般會員


發表:16
回覆:18
積分:6
註冊:2008-09-17

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-02-05 01:20:47 IP:118.166.xxx.xxx 訂閱
依user輸入的月份,統計出當月份中A、B兩類產品的銷售數量,
同時也要統計出上個月的銷售數量,

例如在查詢視窗上選擇了2009年3月,GRID的結果就會像這樣子:
(上月就是指 2009年2月)
客戶A類 A類 上月B類B類 上月
C001 100 40 50 20
C004 70 300 120 100
C006 150 90 80 120








SELECT CUSTNO,
SUM(DECODE(KIND, 'A' , AMT , 0)) AS A類,
SUM(DECODE(KIND, 'B' , AMT , 0)) AS B類
FROM SALES
WHERE SUBSTR(SDATE ,1,6)='200903' (ORACLE資料庫裡存的日期格式是八碼:YYYYMMDD)
AND CUSTNO >= 'C0001' AND CUSTNO <= 'C020'
GROUP BY CUSTNO

當月的我還可以組出SQL,
上個月的部份可以直接用SQL語法下得出來嗎?
還是要用程式才可以? 要怎麼做呢?

如果剛好選到1月,上個月就是去年的12月,那又該怎麼辦?
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-02-05 08:49:48 IP:122.116.xxx.xxx 未訂閱
您好,

我認為方法有二 :
1. 由 delphi 算出上個月當成參數傳入 sql statement
假設 使用者選的年月放在 dstr0, 格式為 yyyymm
dstr2 := formatdatetime('yyyymm', incmonth(encodedate(strtoint(copy(dstr0,1,4)), strtoint(copy(dstr0,5,2)), 1), -1));
然後 sql statement 改成 參數型
SELECT CUSTNO,
SUM(DECODE(KIND, 'A' , AMT , 0)) AS A類,
SUM(DECODE(KIND, 'B' , AMT , 0)) AS B類
FROM SALES
WHERE SUBSTR(SDATE ,1,6)= :datestr (ORACLE資料庫裡存的日期格式是八碼:YYYYMMDD)
AND CUSTNO >= 'C0001' AND CUSTNO <= 'C020'
GROUP BY CUSTNO
然後 dstr2 傳入 :datestr


2. 由 oracle 直接算上個月
SELECT CUSTNO,
SUM(DECODE(KIND, 'A' , AMT , 0)) AS A類,
SUM(DECODE(KIND, 'B' , AMT , 0)) AS B類
FROM SALES
WHERE SUBSTR(SDATE ,1,6)= to_char(add_months(to_date(:datestr,'yyyymm'),-1), 'yyyymm') (ORACLE資料庫裡存的日期格式是八碼:YYYYMMDD)
AND CUSTNO >= 'C0001' AND CUSTNO <= 'C020'
GROUP BY CUSTNO
然後直接傳入 dstr 給 :datestr

======================================================
如果要一次取回兩個日期的資料, 可用 union all 或是
方法一.
SELECT substr(sdate,1,6) yyyymm, CUSTNO,
SUM(DECODE(KIND, 'A' , AMT , 0)) AS A類,
SUM(DECODE(KIND, 'B' , AMT , 0)) AS B類
FROM SALES
WHERE (SUBSTR(SDATE ,1,6) = :datestr0 or SUBSTR(SDATE ,1,6)= :datestr2)
AND CUSTNO >= 'C0001' AND CUSTNO <= 'C020'
GROUP BY substr(sdate,1,6), CUSTNO
然後 dstr0 傳給 :datestr0, dstr2 傳給 :datestr2
方法二.
SELECT substr(sdate,1,6) yyyymm, CUSTNO,
SUM(DECODE(KIND, 'A' , AMT , 0)) AS A類,
SUM(DECODE(KIND, 'B' , AMT , 0)) AS B類
FROM SALES
WHERE (SUBSTR(SDATE,1,6) = :datestr or SUBSTR(SDATE ,1,6) = to_char(add_months(to_date(:datestr,'yyyymm'),-1), 'yyyymm'))
AND CUSTNO >= 'C0001' AND CUSTNO <= 'C020'
GROUP BY substr(sdate,1,6), CUSTNO

========================================================

若要做到 A本月, A上月, B本月, B上月 在同一列, 建議用 UNION ALL 再 GROUP

方法一.
SELECT CUSTNO, SUM(A類) A類, SUM(A類上月) A類上月, SUM(B類) B類, SUM(B類上月) B類上月
FROM (
SELECT CUSTNO, SUM(DECODE(KIND, 'A' , AMT , 0)) AS A類,
SUM(DECODE(KIND, 'B' , AMT , 0)) AS B類,
0 A類上月, 0 B類上月
FROM SALES
WHERE SUBSTR(SDATE ,1,6) = :datestr0
AND CUSTNO >= 'C0001'
AND CUSTNO <= 'C020'
GROUP BY substr(sdate,1,6), CUSTNO
UNION ALL
SELECT CUSTNO, 0, 0,
SUM(DECODE(KIND, 'A' , AMT , 0)),
SUM(DECODE(KIND, 'B' , AMT , 0))
FROM SALES
WHERE SUBSTR(SDATE ,1,6)= :datestr2
AND CUSTNO >= 'C0001'
AND CUSTNO <= 'C020'
GROUP BY substr(sdate,1,6), CUSTNO
)
GROUP BY CUSTNO然後 dstr0 傳給 :datestr0, dstr2 傳給 :datestr2
方法二.
改法差不多, 請您試一下.

======================

要前後月放在同一列用 JOIN 也可以, 但記得最近也有一篇類似討論, ORACLE 對 FULL JOIN 的定義好像和想像不一樣,
所以建議直接用 UNION ALL 再 GROUP 的方式.



------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2009-02-05 08:56:57, 註解 無‧
st33chen 重新編輯於 2009-02-05 08:57:42, 註解 無‧
st33chen 重新編輯於 2009-02-05 08:58:23, 註解 無‧
st33chen 重新編輯於 2009-02-06 08:28:29, 註解 無‧
st33chen 重新編輯於 2009-02-06 08:44:48, 註解 無‧
st33chen 重新編輯於 2009-02-06 08:51:20, 註解 無‧
st33chen 重新編輯於 2009-02-06 08:57:48, 註解 無‧
cindyliu
一般會員


發表:16
回覆:18
積分:6
註冊:2008-09-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-02-19 22:21:16 IP:118.166.xxx.xxx 訂閱
用了由 oracle 直接算上個月的方法OK囉...
而且也解決了1月、12月的問題..

SELECT CUSTNO,
SUM(DECODE(KIND, 'A' , AMT , 0)) AS A類,
SUM(DECODE(KIND, 'B' , AMT , 0)) AS B類
FROM SALES
WHERE SUBSTR(SDATE ,1,6)= to_char(add_months(to_date(:datestr,'yyyymm'),-1), 'yyyymm')
系統時間:2024-05-16 11:23:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!