2009年12月30日 星期三
2009年12月28日 星期一
DOS環境變數取值的方法
C:\> echo %DATE%
星期一 2009/12/28
C:\> echo %DATE:~4,10%
2009/12/28
Note: 日期變數位移4,取10個字, 中文字也算一個位移!
C:\>echo %DATE:~4,4% 年 %DATE:~9,2% 月 %DATE:~12,2% 日
2009 年 12 月 28 日
C:\>echo %time%
14:00:53.59
C:\>echo %time:~0,2%%time:~3,2%%time:~6,2%
140358
星期一 2009/12/28
C:\> echo %DATE:~4,10%
2009/12/28
Note: 日期變數位移4,取10個字, 中文字也算一個位移!
C:\>echo %DATE:~4,4% 年 %DATE:~9,2% 月 %DATE:~12,2% 日
2009 年 12 月 28 日
C:\>echo %time%
14:00:53.59
C:\>echo %time:~0,2%%time:~3,2%%time:~6,2%
140358
2009年11月9日 星期一
2009年10月21日 星期三
DNS 遞迴查詢
DNS 的查詢方式分兩種:
1. Recursive Query: (適用於 DNS Client 對 DNS Server)
DNS client 端只丟出一個詢問給 local DNS server,
然後 local DNS 就會不斷地查到答案出來為止.
2. Iterative Query: (適用於 DNS Server 對 DNS Server)
Local DNS 對其它 DNS 發出的詢問, 都只是知道一個更進一步的線索,
然後發問者(local DNS)根據線索再去進一步找答案.
MISC:
*. 區網內使用的DNS服務 (屬 DNS Client 對 DNS Server),一般是 Recursive Query.
*. 供外部對自家域名解析用的DNS服務 (屬 DNS Server 對 DNS Server),
一般是 Iterative Query, 所以應可以停用遞迴與轉送.
*. Root name server 因負載考量只接受 Iterative Query.
1. Recursive Query: (適用於 DNS Client 對 DNS Server)
DNS client 端只丟出一個詢問給 local DNS server,
然後 local DNS 就會不斷地查到答案出來為止.
2. Iterative Query: (適用於 DNS Server 對 DNS Server)
Local DNS 對其它 DNS 發出的詢問, 都只是知道一個更進一步的線索,
然後發問者(local DNS)根據線索再去進一步找答案.
MISC:
*. 區網內使用的DNS服務 (屬 DNS Client 對 DNS Server),一般是 Recursive Query.
*. 供外部對自家域名解析用的DNS服務 (屬 DNS Server 對 DNS Server),
一般是 Iterative Query, 所以應可以停用遞迴與轉送.
*. Root name server 因負載考量只接受 Iterative Query.
2009年9月24日 星期四
免費的 DNS 代管服務
免費的 DNS 代管服務
http://www.everydns.net
http://www.dnspark.com/services/freeServices.php
http://domain.club.tw/showthread.php?t=2142
http://mydomain.com/
http://everydns.net/
http://zoneedit.com/
http://powerdns.com/
http://www.xname.org/
http://www.technopagan.org/dynamic/
PS:
1.網域名稱申請和DNS指定 http://nweb.hinet.net/
2.DNS反解和次領域申請 http://hidomain.hinet.net/hidns.html
http://www.everydns.net
http://www.dnspark.com/services/freeServices.php
http://domain.club.tw/showthread.php?t=2142
http://mydomain.com/
http://everydns.net/
http://zoneedit.com/
http://powerdns.com/
http://www.xname.org/
http://www.technopagan.org/dynamic/
PS:
1.網域名稱申請和DNS指定 http://nweb.hinet.net/
2.DNS反解和次領域申請 http://hidomain.hinet.net/hidns.html
2009年9月11日 星期五
挑選同列最大與最小
ORACLE SQL 挑選同列最大與最小
SQL> select * from t2;
A B C D
-------------------- -------------------- -------------------- ------
1111 1 1 1
2222 1 1 2
3333 2 1 1
4444 2 2 1
5555 2 2 2
SQL> select greatest(a,b,c,d), least(a,b,c,d) from t2;
GREATEST(A,B,C,D) LEAST(A,B,C,D)
-------------------- --------------------
1111 1
2222 1
3333 1
4444 1
5555 2
2009年9月3日 星期四
ORACLE PIVOT 樞紐表
網路文章,聽說11g 已支援PIVOT樞紐表的應用了!
Oracle pivot SQL Tips
http://www.praetoriate.com/t_pivot_sql.htm
Oracle Pivot examples
http://www.dba-oracle.com/t_pivot_examples.htm
Oracle pivot SQL Tips
http://www.praetoriate.com/t_pivot_sql.htm
Oracle Pivot examples
http://www.dba-oracle.com/t_pivot_examples.htm
2009年8月27日 星期四
Oracle 10g XE免費資料庫
資料庫大廠甲骨文推出免費的資料庫產品Oracle Database 10g XE(Express Edition)
Oracle Database XE相容於32位元的Linux及Windows作業系統,
可安裝於該產品所支援的任何硬體平台。
免費入門版資料庫產品Oracle Database XE有以下使用條件:
● 最多使用一個CPU或一個雙核心處理器。
● 最多使用1 GB記憶體。
● 每部電腦只能執行一個資料事例(instance)。
● 最多可儲存4 GB的用戶資料。
------------------------------------------------------------
● 支援多人連線 (若架在XP上,有預設10個連線數的限制)
● OracleXE_r2 安裝檔約佔211M, 安裝目錄 oraclexe約佔1.3G.
● 安裝前先設好環境變數 ORACLE_SID=XE, NLS_LANG=...;
------------------------------------------------------------
官網:
http://www.oracle.com/technology/software/products/database/xe/index.html
http://download.oracle.com/docs/cd/B25329_01/doc/admin.102/b25610/toc.htm
http://www.oracle.com/technology/software/tech/dotnet/odtxedownloads.html
Oracle Database XE相容於32位元的Linux及Windows作業系統,
可安裝於該產品所支援的任何硬體平台。
免費入門版資料庫產品Oracle Database XE有以下使用條件:
● 最多使用一個CPU或一個雙核心處理器。
● 最多使用1 GB記憶體。
● 每部電腦只能執行一個資料事例(instance)。
● 最多可儲存4 GB的用戶資料。
------------------------------------------------------------
● 支援多人連線 (若架在XP上,有預設10個連線數的限制)
● OracleXE_r2 安裝檔約佔211M, 安裝目錄 oraclexe約佔1.3G.
● 安裝前先設好環境變數 ORACLE_SID=XE, NLS_LANG=...;
------------------------------------------------------------
官網:
http://www.oracle.com/technology/software/products/database/xe/index.html
http://download.oracle.com/docs/cd/B25329_01/doc/admin.102/b25610/toc.htm
http://www.oracle.com/technology/software/tech/dotnet/odtxedownloads.html
2009年8月10日 星期一
SQL ADD_MONTHS 自動轉換月底的日期
ADD_MONTHS 當遇到月底的日期時, 就會自動轉換找對應的月底日期.
若是一定要無視月底的特性, 找出對應的日期,我的想法是:利用case when 判斷,日期小,則置換,如...
http://www.blueshop.com.tw/board/show.asp?subcde=BRD200903301158431K8&fumcde=
若是一定要無視月底的特性, 找出對應的日期,我的想法是:利用case when 判斷,日期小,則置換,如...
http://www.blueshop.com.tw/board/show.asp?subcde=BRD200903301158431K8&fumcde=
2009年6月16日 星期二
2009年5月5日 星期二
Office 相容套件
讓 Office 2003 能讀取 Office 2007 的檔案
2009年4月17日 星期五
列舉資料比對
如何,在以逗點分隔的列舉資料內,找出特定ID值.
例如, 找出以下 remark 欄位資料,有值為 c, 而不是cd者.
例如, 找出以下 remark 欄位資料,有值為 c, 而不是cd者.
ITEM REMARK
---------- -------------
aaa a,b
bbb b,d
ccc a, b ,c ,d
ddd ab,cd,e
方法:
1. 消除空白
2. 前後包逗點
3. 利用like比對資料, 如下,
select item, remark
from tb
where (','|| replace(remark,' ','') || ',') like ('%,c,%');
ITEM REMARK
---------- ------------
ccc a, b ,c ,d
Note: 進階一點,還可以將like的對象,與其他Table欄位關聯,像MySQL的例子這樣子...
SELECT B.item, sum(A.money) as A_money
FROM B, A
WHERE CONCAT(',', B.nos, ',') Like CONCAT('%,', A.id, ',%')
GROUP BY B.item;
2009年4月9日 星期四
MSN 9.0 移除方法
MSN 9.0 免安裝版無法移除的解決方法
1. 使用 Windows Installer CleanUp 公用程式,清除 Windows Installer 資料庫中的項目。
a. 下載並安裝 Windows Installer CleanUp 公用程式。
url:http://support.microsoft.com/default.aspx?scid=kb;zh-tw;290301
b. 啟動公用程式,再按一下公用程式所找到的任何 Messenger 項目,然後按一下 [移除]。
2. 安裝(或使用)其他版本的 MSN Messenger
a. Messenger 最新版本 http://get.live.com/messenger
b. 若原本的舊版本 MSN 仍在系統內, 利用 regedit 搜尋所有當初 msn 9.0 的安裝路徑,
並手動刪除之(滿多的呢), 然後執行舊版本 MSN, 即可恢復正常.
1. 使用 Windows Installer CleanUp 公用程式,清除 Windows Installer 資料庫中的項目。
a. 下載並安裝 Windows Installer CleanUp 公用程式。
url:http://support.microsoft.com/default.aspx?scid=kb;zh-tw;290301
b. 啟動公用程式,再按一下公用程式所找到的任何 Messenger 項目,然後按一下 [移除]。
2. 安裝(或使用)其他版本的 MSN Messenger
a. Messenger 最新版本 http://get.live.com/messenger
b. 若原本的舊版本 MSN 仍在系統內, 利用 regedit 搜尋所有當初 msn 9.0 的安裝路徑,
並手動刪除之(滿多的呢), 然後執行舊版本 MSN, 即可恢復正常.
SQL 各季日期統計
判斷資料是屬於哪一季的,然後分別予以加總,
年度開始日期 : trunc(sysdate,'Y')
第一季的結束日期 : add_months(trunc(sysdate,'Y'),3 )-1
...
第四季的結束日期 : add_months(trunc(sysdate,'Y'),12)-1
年度開始日期 : trunc(sysdate,'Y')
第一季的結束日期 : add_months(trunc(sysdate,'Y'),3 )-1
...
第四季的結束日期 : add_months(trunc(sysdate,'Y'),12)-1
select UNIT,
sum(case when txdate< trunc(sysdate,'Y') then AMT else 0 end) BeginAMT,
sum(case when txdate<=(add_months(trunc(sysdate,'Y'),3 )-1) then AMT else 0 end) Q1,
sum(case when txdate<=(add_months(trunc(sysdate,'Y'),6 )-1) then AMT else 0 end) Q2,
sum(case when txdate<=(add_months(trunc(sysdate,'Y'),9 )-1) then AMT else 0 end) Q3,
sum(case when txdate<=(add_months(trunc(sysdate,'Y'),12)-1) then AMT else 0 end) Q4
from TABLENAME
where txdate <= sysdate
group by UNIT;
2009年3月24日 星期二
自寫 rownum 的方法
Oracle SQL有個 rownum 的內建功能, 可以將select 的結果自動編號.
例如:找出以下表格欄位TEST1.L為偶數的資料列, 並給予編號如下,
select rownum, L, P, Q from test1 where mod(L,2)=0;
ROWNUM L P Q
--------- --------- - ---------
1 2 B 2
2 4 C 3
3 6 A 3
4 8 G 3
其實也可以用以下SQL語法,達到相同的目的,
select count(y.L) my_rownum, x.L, x.P, x.Q
from test1 x, test1 y
where x.L >= y.L
and mod(x.L,2)=0 --->
and mod(y.L,2)=0 ---> 注意:x,y條件皆相同
group by x.L, x.P, x.Q;
MY_ROWNUM L P Q
--------- --------- - ---------
1 2 B 2
2 4 C 3
3 6 A 3
4 8 G 3
PS:這種自身join的方法,也或許可以用在其他資料庫或不支援rownum的情況.
再加一個範例: 相同x.cus_id, 按照 x.risk,x.bra_id,x.pr_rank_name,x.pro_name 排名
select count(y.cus_id) as num,
x.cus_id,x.risk,x.bra_id,x.pr_rank_name,x.pro_name
from aaa x, aaa y
where x.cus_id = y.cus_id
and ((x.risk > y.risk) or
((x.risk = y.risk) and (x.bra_id > y.bra_id)) or
((x.risk = y.risk) and (x.bra_id = y.bra_id) and (x.pr_rank_name > y.pr_rank_name)) or
((x.risk = y.risk) and (x.bra_id = y.bra_id) and (x.pr_rank_name = y.pr_rank_name) and (x.pro_name > y.pro_name )) or
((x.risk = y.risk) and (x.bra_id = y.bra_id) and (x.pr_rank_name = y.pr_rank_name) and (x.pro_name = y.pro_name ))
)
group by x.cus_id,x.risk,x.bra_id,x.pr_rank_name,x.pro_name
2009年3月23日 星期一
各種免費網路資源
免費資源:
http://www.slime.com.tw/freeResource.htm
免費的網路傳檔硬碟: (單檔限制/刪檔時限/語系/註冊)
file dropper 檔案上傳 (5G/30天/英文/不需註冊): http://www.filedropper.com/
FlyUpload 免費網路硬碟(2G/30天/英文/不需註冊): http://www.flyupload.com/
iFile.it 免費網路硬碟(100M/30天/繁中/不需註冊): http://ifile.it/
MediaFire (100M/永不刪檔/英文/免費註冊): http://www.mediafire.com/
BaDonGo(1G/永不刪檔/多語系/免費註冊): http://www.badongo.com/
免費的貼圖空間:
XS.To: http://xs.to/
http://xs537.xs.to/xs537/09120/c15300885.gif
Pict.com: http://www.pict.com/
http://img2.pict.com/ee/1a/1f/d8c4219dc8d580b4f3519f4ae7/wrpgY/c15300.gif
http://www.slime.com.tw/freeResource.htm
免費的網路傳檔硬碟: (單檔限制/刪檔時限/語系/註冊)
file dropper 檔案上傳 (5G/30天/英文/不需註冊): http://www.filedropper.com/
FlyUpload 免費網路硬碟(2G/30天/英文/不需註冊): http://www.flyupload.com/
iFile.it 免費網路硬碟(100M/30天/繁中/不需註冊): http://ifile.it/
MediaFire (100M/永不刪檔/英文/免費註冊): http://www.mediafire.com/
BaDonGo(1G/永不刪檔/多語系/免費註冊): http://www.badongo.com/
免費的貼圖空間:
XS.To: http://xs.to/
Pict.com: http://www.pict.com/
轉換工具 - 網路資源
PDF Converter 提供線上 PDF 與 Office 文件(網頁文件) 的相互格式轉換:
http://www.freepdfconvert.com/
Remove PDF passwords and restrictions (such as printing, copying text, etc.)
http://freemypdf.com/
Super Screenshot 線上網頁抓取工具 :
http://www.superscreenshot.com/
PS: 測試結果, 大致都不錯, 只是部落格程式框的圖片位置有稍微跑掉,可惜.
http://www.freepdfconvert.com/
Remove PDF passwords and restrictions (such as printing, copying text, etc.)
http://freemypdf.com/
Super Screenshot 線上網頁抓取工具 :
http://www.superscreenshot.com/
PS: 測試結果, 大致都不錯, 只是部落格程式框的圖片位置有稍微跑掉,可惜.
2009年3月22日 星期日
Webmail 網路資源
網路信箱連結
Gmail:
https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fhl%3Dzh-TW%26tab%3Dwm%26ui%3Dhtml%26zy%3Dl&bsv=zpwhtygjntrz&scc=1
Hotmail:
http://login.live.com/login.srf?wa=wsignin1.0&rpsnv=10&ct=1237712851&rver=5.5.4177.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=1028&id=64855&mkt=zh-TW
Yahoo:
https://login.yahoo.com/config/login?.intl=tw&.src=ym&.done=https://tw.login.yahoo.com/cgi-bin/kcookie.cgi/mail/http%3a//edit.tpe.yahoo.com/config/mail%3f.intl=tw
Pchome:
https://member.pchome.com.tw/login.html?ref=http%3A%2F%2Fmail.pchome.com.tw%2F
Aol:
https://my.screenname.aol.com/_cqr/login/login.psp?sitedomain=sns.webmail.aol.com&lang=zh&locale=tw&authLev=0&siteState=ver%3a4%7crt%3aSTANDARD%7cac%3aWS%7cat%3aSNS%7cld%3amail.aol.tw%7cuv%3aAOL%7clc%3azh-tw%7cmt%3aAOL%7csnt%3aScreenName&offerId=webmail-zh-taiwan&seamless=novl
Hinet:
http://webmail.hinet.net/
可拋式信箱:
http://www.guerrillamail.com/
Gmail:
https://www.google.com/accounts/ServiceLogin?service=mail&passive=true&rm=false&continue=http%3A%2F%2Fmail.google.com%2Fmail%2F%3Fhl%3Dzh-TW%26tab%3Dwm%26ui%3Dhtml%26zy%3Dl&bsv=zpwhtygjntrz&scc=1
Hotmail:
http://login.live.com/login.srf?wa=wsignin1.0&rpsnv=10&ct=1237712851&rver=5.5.4177.0&wp=MBI&wreply=http:%2F%2Fmail.live.com%2Fdefault.aspx&lc=1028&id=64855&mkt=zh-TW
Yahoo:
https://login.yahoo.com/config/login?.intl=tw&.src=ym&.done=https://tw.login.yahoo.com/cgi-bin/kcookie.cgi/mail/http%3a//edit.tpe.yahoo.com/config/mail%3f.intl=tw
Pchome:
https://member.pchome.com.tw/login.html?ref=http%3A%2F%2Fmail.pchome.com.tw%2F
Aol:
https://my.screenname.aol.com/_cqr/login/login.psp?sitedomain=sns.webmail.aol.com&lang=zh&locale=tw&authLev=0&siteState=ver%3a4%7crt%3aSTANDARD%7cac%3aWS%7cat%3aSNS%7cld%3amail.aol.tw%7cuv%3aAOL%7clc%3azh-tw%7cmt%3aAOL%7csnt%3aScreenName&offerId=webmail-zh-taiwan&seamless=novl
Hinet:
http://webmail.hinet.net/
可拋式信箱:
http://www.guerrillamail.com/
2009年3月19日 星期四
ACCESS 排名取值
ACCESS 沒有ROW_NUMBER()的功能,因此若要排名次則改用如下的方式,
CASE 1: 在相同購買物品項目中,找出最後2次購買的資料:
SELECT X.購買物品, X.第幾次, X.價格, count(Y.購買物品) AS Rank, (X.購買物品 & '-' & X.第幾次 ) as ID
FROM DataTable AS X, DataTable AS Y
WHERE X.購買物品 = Y.購買物品 and
(X.第幾次 < Y.第幾次 or (X.購買物品 = Y.購買物品 and X.第幾次= Y.第幾次 ))
GROUP BY X.購買物品, X.第幾次, X.價格
HAVING count(Y.購買物品) <= 2;
CASE 2: 在相同購買物品項目中,僅保留最後2次購買的資料:
Delete from DataTable where (購買物品 & '-' & 第幾次 ) not in
(
SELECT (X.購買物品 & '-' & X.第幾次 ) as ID
FROM DataTable AS X, DataTable AS Y
WHERE X.購買物品 = Y.購買物品 and
(X.第幾次 < Y.第幾次 or (X.購買物品 = Y.購買物品 and X.第幾次= Y.第幾次))
GROUP BY X.購買物品, X.第幾次, X.價格
HAVING count(Y.購買物品) <= 2
)
PS:若是DataTable有主索引,則更方便操作.
2009年3月13日 星期五
SQL 流水號字串補零
輸出 "YYYYMMDD"
1. CONVERT(varchar(8), GETDATE(), 112)
輸出 "0123"
1. REPLICATE('0', 4 - LEN(CONVERT(char(4), 123))) + CONVERT(char(4), 123)
2. RIGHT('0000' + CONVERT(varchar(4), 123), 4)
3. RIGHT('0000' + CAST(123 as varchar), 4)
輸出結果:YYYYMMDD流水號 =>
1. CONVERT(varchar(8), GETDATE(), 112) + RIGHT('0000'+CAST(續號 as varchar),4)
PS:CAST 像是 CONVERT 的陽春版了.
1. CONVERT(varchar(8), GETDATE(), 112)
輸出 "0123"
1. REPLICATE('0', 4 - LEN(CONVERT(char(4), 123))) + CONVERT(char(4), 123)
2. RIGHT('0000' + CONVERT(varchar(4), 123), 4)
3. RIGHT('0000' + CAST(123 as varchar), 4)
輸出結果:YYYYMMDD流水號 =>
1. CONVERT(varchar(8), GETDATE(), 112) + RIGHT('0000'+CAST(續號 as varchar),4)
PS:CAST 像是 CONVERT 的陽春版了.
ACCESS 多重 JOIN 疑問
ACCESS 不能同時使用兩個LEFT JOIN 嗎? 疑 ?
怎麼試都不成功...
最後改變方法...把資料都先UNION ALL 起來, 雖然WORKing, 但,這種邏輯是否是當呢? 記憶體...效能...
PS: 其他SQL 可以用case when 替換 iif 達到類似的目的.
怎麼試都不成功...
SELECT CC.編號,CC.品名,AA.表單A數量和,BB.表單B數量和,(AA.表單A數量和-BB.表單B數量和) AS 兩表數量差異
FROM
(SELECT 表單A.編號,表單A.品名 FROM 表單A UNION SELECT 表單B.編號,表單B.品名 FROM 表單B ) AS CC
LEFT JOIN (SELECT 表單A.編號,表單A.品名,SUM(表單A.數量) AS 表單A數量和 FROM 表單A GROUP BY 表單A.編號,表單A.品名) AS AA ON CC.編號 = AA.編號
LEFT JOIN (SELECT 表單B.編號,表單B.品名,SUM(表單B.數量) AS 表單B數量和 FROM 表單B GROUP BY 表單B.編號,表單B.品名) AS BB ON CC.編號 = BB.編號
最後改變方法...把資料都先UNION ALL 起來, 雖然WORKing, 但,這種邏輯是否是當呢? 記憶體...效能...
SELECT 編號,
品名,
SUM(IIF(ST='A',數量,0)) AS 表單A數量,
SUM(IIF(ST='A',0,數量)) AS 表單B數量,
abs(SUM(IIF(ST='A',數量,數量*-1))) AS 兩表數量差異
FROM (SELECT 'A' AS ST, 編號, 品名, 數量 FROM 表單A
UNION ALL
SELECT 'B' AS ST, 編號, 品名, 數量 FROM 表單B
) AS CC
GROUP BY 編號, 品名
PS: 其他SQL 可以用case when 替換 iif 達到類似的目的.
2009年3月11日 星期三
Row_number 的使用
利用分析函數,求得排名, 再利用排名,來控制資料輸出格式.(以下為MsSQL語法,Oracle 也有類似功能)
註:
row_number():逐列排名,重複資料,不允許相同排名,仍有第1,2名之分.
rank():允許有2個第1名,此時就沒有第2名,直接跳第3名.
dense_rank():允許有2個第1名,第3個則為第2名,即名次不跳號.
ACCESS 不支援,其他資料庫尚未測過.
ACCESS 可以參考自身JOIN的方法達到類似的目的.
SELECT (CASE WHEN rank2 = 1 THEN aaa ELSE '' END) AS BreakA, bbb
--> 相同的 aaa 只出現一次,像作報表一樣
FROM
(SELECT c.aaa, c.bbb,
row_number() OVER
(partition BY c.aaa, c.bbb ORDER BY c.aaa, c.bbb) AS rank1,
row_number() OVER
(partition BY c.aaa ORDER BY c.aaa, c.bbb) AS rank2
FROM dbo.ItemA AS a LEFT OUTER JOIN dbo.ItemC AS c
ON a.ItemID = c.ItemID) AS g
WHERE rank1 = 1 ---> 類似 distinct 的效果
ORDER BY aaa, bbb
註:
row_number():逐列排名,重複資料,不允許相同排名,仍有第1,2名之分.
rank():允許有2個第1名,此時就沒有第2名,直接跳第3名.
dense_rank():允許有2個第1名,第3個則為第2名,即名次不跳號.
ACCESS 不支援,其他資料庫尚未測過.
ACCESS 可以參考自身JOIN的方法達到類似的目的.
2009年3月10日 星期二
Oracle Trunc 函數
TRUNC()函數分兩種: TRUNC(for number) 和 TRUNC(for date)
TRUNC(number[,n]): 捨去指定小數點位數後的值. 註:n若為負數則會往前捨去小數前的位數.
TRUNC(date[,fmt]): 捨去指定參數後的日期時間. fmt:'YY','MM','DD','HH','MI'等
TRUNC(number[,n]): 捨去指定小數點位數後的值. 註:n若為負數則會往前捨去小數前的位數.
TRUNC(date[,fmt]): 捨去指定參數後的日期時間. fmt:'YY','MM','DD','HH','MI'等
2009年3月9日 星期一
SQL Update 特殊寫法
利用 Case When 選擇性的update 欄位內容 (Oracle 8.1.7, MsSQL, MySQL 適用)
Oracle 判斷的較不嚴謹, null 與 空字串看來相同...
MsSQL 與 MySQL 的用法,有分空字串與NULL
於Oracle 還有decode 的用法,可以達到雷同的效果,
於ACCESS 還有iif 的用法,可以達到雷同的效果,
補充:
Oracle 判斷的較不嚴謹, null 與 空字串看來相同...
表格T1:
SQL> select * from t1;
USER_ID CLASS
--------- --------------------
1 A
2
3 C
語法:
SQL> update t1 set class = (case when class is null then 'NullValue' else class end);
3 rows updated.
結果:
SQL> select * from t1;
USER_ID CLASS
--------- --------------------
1 A
2 NullValue
3 C
MsSQL 與 MySQL 的用法,有分空字串與NULL
update t1 set class = (case when class='' then 'EmptyValue' else class end);
update t1 set class = (case when class is null then 'NullValue' else class end);
於Oracle 還有decode 的用法,可以達到雷同的效果,
update t1 set class = decode(class,null,'NULLVALUE',class);
於ACCESS 還有iif 的用法,可以達到雷同的效果,
Private Sub do_sql_Click()
On Error GoTo Err_do_sql_Click
Dim SQL As String
'OK: 但沒有必要多加判斷
SQL = "UPDATE [員工資料] " & _
"SET [部門代號] = iif([部門代號]='' or [部門代號] is null ,'NullValue',[部門代號]) " & _
"WHERE [工號] = '908' "
'NG: 以空字串判斷讀不到新增record的 null也讀不到修改後的空白欄位
SQL = "UPDATE [員工資料] " & _
"SET [部門代號] = iif([部門代號]='','空字串',[部門代號]) " & _
"WHERE [工號] = '908' "
'OK! 測試發現, ACCESS 不認空字串'' 型態,用null即可包含空字串.
SQL = "UPDATE [員工資料] " & _
"SET [部門代號] = iif([部門代號] is null,'nullvalue',[部門代號]) " & _
"WHERE [工號] = '907' "
DoCmd.RunSQL SQL
MsgBox (SQL)
Exit_do_sql_Click:
Exit Sub
Err_do_sql_Click:
MsgBox Err.Description
Resume Exit_do_sql_Click
End Sub
補充:
於 MsSQL 必須留意, 空字串''與 NULL 是不同的!
空字串於 CASE WHEN 可以用 CLASS = '' 表示比較條件式,
NULL 於 CASE WHEN 應該用 CLASS IS NULL 表示條件式, 或利用 ISNULL(CLASS,'NULLVALUE')轉換之.
PS: 其他資料庫尚未實測.
2009年3月6日 星期五
SQL Group By 直轉橫
Oracle SQL, MySQL, 通用的語法, 一般的group by 統計方式,為直列式由上而下逐筆顯示,
以下方式, 通常用於將特定已知的"資料",轉向作為[欄位]後,進行分析統計.
簡單的說, 就是原來直放的資料,變成橫放.
範例:
簡化的作法,結果一樣....
PS:若是ACCESS 資料庫, case when 換成iff 的語法即可,
如: SUM(IIF(CLASS = 'a', 1, 0))
以下方式, 通常用於將特定已知的"資料",轉向作為[欄位]後,進行分析統計.
簡單的說, 就是原來直放的資料,變成橫放.
範例:
按各個userid, 橫向呈現於各個 CLASS_A,B,C 統計分析相關資料出現的次數.SELECT user_id, sum(CLASS_A) AS CLASS_A,
sum(CLASS_B) AS CLASS_B,
sum(CLASS_C) AS CLASS_C
FROM ( select user_id,
(CASE WHEN CLASS = 'a' THEN 1 ELSE '' END) AS CLASS_A,
(CASE WHEN CLASS = 'b' THEN 1 ELSE '' END) AS CLASS_B,
(CASE WHEN CLASS = 'c' THEN 1 ELSE '' END) AS CLASS_C
from T1
)
GROUP BY USER_ID
ORDER BY USER_ID;
簡化的作法,結果一樣....
SELECT user_id,
sum(CASE WHEN CLASS = 'a' THEN 1 ELSE '' END) AS CLASS_A,
sum(CASE WHEN CLASS = 'b' THEN 1 ELSE '' END) AS CLASS_B,
sum(CASE WHEN CLASS = 'c' THEN 1 ELSE '' END) AS CLASS_C
FROM T1
GROUP BY USER_ID
ORDER BY USER_ID;
PS:若是ACCESS 資料庫, case when 換成iff 的語法即可,
如: SUM(IIF(CLASS = 'a', 1, 0))
SQL Case When 的使用
Oracle SQL, MySQL, MsSQL 通用的語法, 可以選擇性的加工輸出欄位值:
範例 1:
範例 2:
PS:還可以用於 update set=(case when...), where xxx=(case when...) 敘述中
範例 1:
select user_id,
(CASE WHEN CLASS = 'a' THEN 1 ELSE '' END) AS CLASS_A,
(CASE WHEN CLASS = 'b' THEN 1 ELSE '' END) AS CLASS_B,
(CASE WHEN CLASS = 'c' THEN 1 ELSE '' END) AS CLASS_C
from T1;
範例 2:
select id, (CASE WHEN 數據 = 0 THEN '沒有數據' ELSE 數據 END) AS "數據值"
from T2;
PS:還可以用於 update set=(case when...), where xxx=(case when...) 敘述中
2009年3月4日 星期三
靈格斯詞霸綠色便攜版
Lingoes 靈格斯詞霸 是一款簡明易用的詞典與文本翻譯軟體,
其綠色便攜版本, 無需安裝即可使用, 內置基礎英漢詞典, 即時翻譯等。
官網: http://www.lingoes.cn/zh/index.html
下載: http://www.lingoes.cn/zh/translator/trans_downsoft.php?id=69
其綠色便攜版本, 無需安裝即可使用, 內置基礎英漢詞典, 即時翻譯等。
官網: http://www.lingoes.cn/zh/index.html
下載: http://www.lingoes.cn/zh/translator/trans_downsoft.php?id=69
2009年2月28日 星期六
2009年2月24日 星期二
Access 格式化日期函式
SELECT TEST.名字,
TEST.出生日期,
Year(Date()) & Format(TEST.出生日期,"/MM/DD") as 今年生日
FROM TEST
Recordset.Filter =
"今年生日 >= '" & Format(Date(),"YYYY/MM/DD") &
"' AND 今年生日 <= '"& Format(Date()+7,"YYYY/MM/DD") & "'"
SELECT TEST.名字, TEST.出生日期 FROM TEST
WHERE ( Year(Date()) & Format(TEST.出生日期,"/MM/DD"))
>= Format(Date(),"YYYY/MM/DD")
and ( Year(Date()) & Format(TEST.出生日期,"/MM/DD"))
<= Format(Date()+7,"YYYY/MM/DD");
自身Join排名取值技巧
以下是一個典型的分組排名,把A欄視為學生,B欄視為班別, C,D欄視為各科成績,
希望找出各班的排名, 或者找出指定名次的學生.
解題時,以B欄為群組的分類,並依據是C欄與D欄值的大小排名,名次其實就是找出比自己大的筆數再加上自己.
PS:這種邏輯下,可能出現兩個同分的第1名,而第2名.從缺的情況
希望找出各班的排名, 或者找出指定名次的學生.
解題時,以B欄為群組的分類,並依據是C欄與D欄值的大小排名,名次其實就是找出比自己大的筆數再加上自己.
PS:這種邏輯下,可能出現兩個同分的第1名,而第2名.從缺的情況
資料表:T2
A B C D
--------------------
[1111] [1] [1] [1]
[2222] [1] [1] [2]
[3333] [2] [1] [1]
[4444] [2] [2] [1]
[5555] [2] [2] [2]
排名:以count(y.a)表示
select x.a
from t2 x, t2 y
where x.b = y.b and
( ((x.c < c="y.c">
OR
(x.a=y.a and x.b=y.b and x.c=y.c and x.d=y.d)
)
group by x.a, x.b, x.c, x.d
having count(y.a) = 1 --------> 只顯示排名為1的資料,
order by x.a, x.b, x.c, x.d
結果:
A
------
[2222]
[5555]
Access [保留字] 的用法
Access 欄位名稱使用保留字,導致 UPDATE 陳述式的語法錯誤。
如果已經使用保留字,您可以在每個保留字出現之處使用括號 ([ ]) 括起來,
例如: [password] , 以避免產生錯誤訊息。 但是最好的解決方案是把名稱變更為非保留字。
http://office.microsoft.com/zh-tw/access/HA100306431028.aspx
如果已經使用保留字,您可以在每個保留字出現之處使用括號 ([ ]) 括起來,
例如: [password] , 以避免產生錯誤訊息。 但是最好的解決方案是把名稱變更為非保留字。
http://office.microsoft.com/zh-tw/access/HA100306431028.aspx
Oracle 動態SQL語句
SET SERVEROUTPUT ON
DECLARE
v_sql VARCHAR(200);
v_cursor NUMBER;
v_sno NUMBER;
v_stat NUMBER;
BEGIN
v_sql := 'SELECT 123 SNO FROM DUAL'; --自訂動態SQL語句
v_cursor := dbms_sql.open_cursor; --打開游標
dbms_sql.parse(v_cursor, v_sql, dbms_sql.native); --解析動態SQL語句
dbms_sql.define_column(v_cursor, 1, v_sno); --定義列
v_stat := dbms_sql.execute(v_cursor); --執行動態SQL語句
v_stat := dbms_sql.fetch_rows(v_cursor); --取出一列
dbms_sql.column_value(v_cursor, 1, v_sno); --查詢定義列結果
dbms_sql.close_cursor(v_cursor); --關閉游標
dbms_output.put_line('return value: 'v_sno); --顯示查詢結果
END;
Form6i 如何控制滑鼠指標
SET_APPLICATION_PROPERTY(CURSOR_STYLE, 'BUSY');
-- 程式執行...
SET_APPLICATION_PROPERTY(CURSOR_STYLE, 'DEFAULT');
測試1
使用class="h200"限制區塊高度200點,資料過高自動出現捲軸.
不限高度無捲軸的範圍
開始位置
限制寬度585點,過寬會自動折行
123456789-123456789-123456789-123456789-123456789-123456789-12345678-123456789-
使用 pre 標籤,定位格式縮排.
< = < > = > & = &
select *
from dual;
使用class="h200"限制區塊高度200點,資料過高自動出現捲軸.
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
結束位置
不限高度無捲軸的範圍
插入粗體標記
變更字型大小顏色
訂閱:
文章 (Atom)