全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2527
推到 Plurk!
推到 Facebook!

如何做直式的運算

答題得分者是:st33chen
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-12-15 17:52:24 IP:122.116.xxx.xxx 訂閱
小弟下了一段SQL

SN TIME
1 9:25
2 9:35
3 9:37
4 12:40
.
.
9 16:42

想請教該怎麼寫可以寫出間距的時間
也就是

SN 1 的時間 = Edit1.Text - 9:25 = (Edit1.Text 可以讓我隨時改變開始時間)
SN 2 的時間 = 9:35 - 9:25 = 10分鐘
SN 3 的時間 = 9:37 - 9:35 = 2分鐘

SN 9 的時間 = 16:42 - Edit2.Text = (Edit2.Text 可以讓我隨時改變結束時間)

最後顯示為
SN TIME NUMBER
1 9:25 ?
2 9:35 10
3 9:37 2
4 12:40 184
.
.
9 16:42 ?.
以此類推....


------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-12-15 19:20:04 IP:60.248.xxx.xxx 訂閱
HI, 我用 MSSQL 的方式,寫一段您看看,不過目前該 sql 只能用在 SN 是連續的上面,如果不能連續的話,
請自行加上 Row_Number() 的指令來配合

[code sql]
Create procedure TimeSpan
@sEdit1 varchar(20),
@sEdit2 varchar(20)
AS
BEGIN
SELECT IsNull(a.SN, b.SN 1) SN,
IsNull(a.Time, @sEdit2) ATime,
IsNull(b.Time, @sEdit1) BTime,
DateDiff(Minute, IsNull(b.Time, @sEdit1), IsNull(a.Time, @sEdit2)) as MinuteSpan
FROM Table a full join
Table b on a.SN=(b.SN 1)
order by SN
END
[/code]

那如果您是需要的是在下 SQL Command 時,就能使用的話,也可以直接把上面那段變成 SQLText,如
[code delphi]
SQL.Text := 'SELECT IsNull(a.SN, b.SN 1) SN, '
' IsNull(a.Time, ''' Edit2.Text ''') ATime, '
' IsNull(b.Time, ''' Edit1.Text ''') BTime, '
' DateDiff(Minute, IsNull(b.Time, ''' Edit1.Text '''), IsNull(a.Time, ''' Edit2.Text ''')) as MinuteSpan '
'FROM Table a full join Table b on a.SN=(b.SN 1) order by SN ';
[/code]

===================引 用 lovemari 文 章===================
小弟下了一段SQL

SN TIME
1 9:25
2 9:35
3 9:37
4 12:40
.
.
9 16:42

想請教該怎麼寫可以寫出間距的時間
也就是

SN 1 的時間 = Edit1.Text - 9:25 = (Edit1.Text 可以讓我隨時改變開始時間)
SN 2 的時間 = 9:35 - 9:25 = 10分鐘
SN 3 的時間 = 9:37 - 9:35 = 2分鐘

SN 9 的時間 = 16:42 - Edit2.Text = (Edit2.Text 可以讓我隨時改變結束時間)

最後顯示為
SN TIME NUMBER
1 9:25 ?
2 9:35 10
3 9:37 2
4 12:40 184
.
.
9 16:42 ?.
以此類推....


------
價值的展現,來自於你用哪一個角度來看待它!!
st33chen
尊榮會員


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-12-16 12:48:29 IP:122.116.xxx.xxx 未訂閱
插花一下
CAREYCHEN 大大的 INSULL 就是 ORACLE 的 NVL, 用法一樣.

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

2008-12-16 15:00:03
CAREYCHEN 大大您太客氣了, 老漢在您這學得才多呢.

=======================================================
對不起, 我發覺我打錯了
CAREYCHEN 大大的 ISNULL 就是 ORACLE 的 NVL, 用法一樣.


------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-12-16 15:01:26, 註解 無‧
st33chen 重新編輯於 2008-12-16 15:03:43, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-12-16 13:52:29 IP:60.248.xxx.xxx 訂閱
呵,在 Ktop 就是這樣的好處,可以不只學一個東西,常常看到前輩們的回文都可以讓小弟再學新的東西,
現在雖然沒有 Oracle 的環境,但看著看著,也對 Oracle 和 MSSQL 中的差異一步一步的了解,真是感恩~!



===================引 用 st33chen 文 章===================
插花一下
CAREYCHEN 大大的 INSULL 就是 ORACLE 的 NVL, 用法一樣.
------
價值的展現,來自於你用哪一個角度來看待它!!
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-12-16 13:54:54 IP:122.116.xxx.xxx 訂閱
先謝謝大大的指點

可小弟的SN 並非連續的 = =

有可能第一筆是 123456 第二筆卻成A840CKF

都很不一定耶 那像這種不連續的序號 有其他方法可做嗎?

像大大提到的 Row_Number() 可以請大大教我該怎麼做嗎?

小弟是小新手 >//< THANKS ...

===================引 用 careychen 文 章===================
HI, 我用 MSSQL 的方式,寫一段您看看,不過目前該 sql 只能用在 SN 是連續的上面,如果不能連續的話,
請自行加上 Row_Number() 的指令來配合

[code sql]
Create procedure TimeSpan
@sEdit1 varchar(20),
@sEdit2 varchar(20)
AS
BEGIN
SELECT IsNull(a.SN, b.SN 1) SN,
IsNull(a.Time, @sEdit2) ATime,
IsNull(b.Time, @sEdit1) BTime,
DateDiff(Minute, IsNull(b.Time, @sEdit1), IsNull(a.Time, @sEdit2)) as MinuteSpan
FROM Table a full join
Table b on a.SN=(b.SN 1)
order by SN
END
[/code]

那如果您是需要的是在下 SQL Command 時,就能使用的話,也可以直接把上面那段變成 SQLText,如
[code delphi]
SQL.Text := 'SELECT IsNull(a.SN, b.SN 1) SN, '
' IsNull(a.Time, ''' Edit2.Text ''') ATime, '
' IsNull(b.Time, ''' Edit1.Text ''') BTime, '
' DateDiff(Minute, IsNull(b.Time, ''' Edit1.Text '''), IsNull(a.Time, ''' Edit2.Text ''')) as MinuteSpan '
'FROM Table a full join Table b on a.SN=(b.SN 1) order by SN ';
[/code]

===================引 用 lovemari 文 章===================
小弟下了一段SQL

SN TIME
1 9:25
2 9:35
3 9:37
4 12:40
.
.
9 16:42

想請教該怎麼寫可以寫出間距的時間
也就是

SN 1 的時間 = Edit1.Text - 9:25 = (Edit1.Text 可以讓我隨時改變開始時間)
SN 2 的時間 = 9:35 - 9:25 = 10分鐘
SN 3 的時間 = 9:37 - 9:35 = 2分鐘

SN 9 的時間 = 16:42 - Edit2.Text = (Edit2.Text 可以讓我隨時改變結束時間)

最後顯示為
SN TIME NUMBER
1 9:25 ?
2 9:35 10
3 9:37 2
4 12:40 184
.
.
9 16:42 ?.
以此類推....


------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2008-12-16 13:56:16, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-12-16 14:37:24 IP:60.248.xxx.xxx 訂閱
您用的 Database 是用 Oracle 的嗎? 我這邊先寫 MSSQL 的部份, Oracle 的部份就要請 st33chen 前輩跟您說了

Row_Number() 的用法

這樣的下法就可以讓原本的資料多出一個欄位叫 SN ,而裡面的 Order by 就是指您想要用哪一個欄位來當做 Row_Number() 函數的排序依據
Select Row_Number() over (order by Field) as SN, ...............

所以如果用以下的 SQL 來說明的話,會變成
[code sql]
SELECT IsNull(a.SN, b.SN 1) SN,
IsNull(a.Time, @sEdit2) ATime,
IsNull(b.Time, @sEdit1) BTime,
DateDiff(Minute, IsNull(b.Time, @sEdit1), IsNull(a.Time, @sEdit2)) as MinuteSpan
FROM
(Select Row_Number() over (Order by Time) SN, Time from Table) a full join
(Select Row_Number() over (Order by Time) SN, Time from Table) b on a.SN=(b.SN 1)
order by SN
[/code]

或是更簡明的寫法 ==> 等於是原本一開始跟您說的 Sample 語法上面再加蓋個 With 的東西
(但現在上下兩種效能一樣,只是語法較單純)
[code sql]
with tmpTable(SN, Time) AS
(
Select Row_Number() over (Order by Time), Time from Table
)
SELECT IsNull(a.SN, b.SN 1) SN,
IsNull(a.Time, @sEdit2) ATime,
IsNull(b.Time, @sEdit1) BTime,
DateDiff(Minute, IsNull(b.Time, @sEdit1), IsNull(a.Time, @sEdit2)) as MinuteSpan
FROM tmpTable a full join tmpTable b on a.SN=(b.SN 1)
order by SN
[/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
編輯記錄
careychen 重新編輯於 2008-12-16 14:40:35, 註解 刪掉多餘的回文‧
st33chen
尊榮會員


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-12-16 15:19:18 IP:122.116.xxx.xxx 未訂閱
剛剛測了一下, CAREYCHEN大大的

SELECT IsNull(a.SN, b.SN 1) SN,
IsNull(a.Time, @sEdit2) ATime,
IsNull(b.Time, @sEdit1) BTime,
DateDiff(Minute, IsNull(b.Time, @sEdit1), IsNull(a.Time, @sEdit2)) as MinuteSpan
FROM
(Select Row_Number() over (Order by Time) SN, Time from Table) a full join
(Select Row_Number() over (Order by Time) SN, Time from Table) b on a.SN=(b.SN 1)
order by SN

中, ROW_NUMBER() OVER(....) 這部份在 ORACLE 可以一字不改使用
另外, ORACLE 還有一個內建欄位 ROWNUM 可以用.
其他不改的話, 改這兩句
(Select RowNum SN, Time from Table order by time) a full join
(Select RowNum SN, Time from Table order by time) b on a.SN=(b.SN 1)
請參考一下 LO.
===================引 用 careychen 文 章===================
您用的 Database 是用 Oracle 的嗎? 我這邊先寫 MSSQL 的部份, Oracle 的部份就要請 st33chen 前輩跟您說了

Row_Number() 的用法

這樣的下法就可以讓原本的資料多出一個欄位叫 SN ,而裡面的 Order by 就是指您想要用哪一個欄位來當做 Row_Number() 函數的排序依據
Select Row_Number() over (order by Field) as SN, ...............

所以如果用以下的 SQL 來說明的話,會變成
[code sql]
SELECT IsNull(a.SN, b.SN 1) SN,
IsNull(a.Time, @sEdit2) ATime,
IsNull(b.Time, @sEdit1) BTime,
DateDiff(Minute, IsNull(b.Time, @sEdit1), IsNull(a.Time, @sEdit2)) as MinuteSpan
FROM
(Select Row_Number() over (Order by Time) SN, Time from Table) a full join
(Select Row_Number() over (Order by Time) SN, Time from Table) b on a.SN=(b.SN 1)
order by SN
[/code]

或是更簡明的寫法 ==> 等於是原本一開始跟您說的 Sample 語法上面再加蓋個 With 的東西
(但現在上下兩種效能一樣,只是語法較單純)
[code sql]
with tmpTable(SN, Time) AS
(
Select Row_Number() over (Order by Time), Time from Table
)
SELECT IsNull(a.SN, b.SN 1) SN,
IsNull(a.Time, @sEdit2) ATime,
IsNull(b.Time, @sEdit1) BTime,
DateDiff(Minute, IsNull(b.Time, @sEdit1), IsNull(a.Time, @sEdit2)) as MinuteSpan
FROM tmpTable a full join tmpTable b on a.SN=(b.SN 1)
order by SN
[/code]
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-12-16 15:22:05, 註解 無‧
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-12-16 15:44:54 IP:122.116.xxx.xxx 訂閱
謝謝兩位大大的指點

小弟研究一下兩位大大的

如果還有問題會在這繼續提出的

在此祝福兩位大大身體健康^^
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-12-19 11:47:05 IP:122.116.xxx.xxx 訂閱
DEAR careychen st33chen

小弟有幾各地方不明白

1.SELECT IsNull(a.SN, b.SN 1) SN, <-- SN 是指我原有TABLE的SN 還是ROW_NUMBER 跑出來的排序呢??

2.大大後來補充的非連續序號作法...能否提供SQL作法? 目前手中無DELPHI 測試....真不好意思

3.以下欄位SEQ,SERIAL_NUMBER,REPAIR_TIME


[code delphi]
SELECT ROW_NUMBER() OVER (ORDER BY REPAIR_TIME) AS SEQ,
SERIAL_NUMBER,REPAIR_TIME
FROM G_SN_REPAIR
[/code]


我是有想過一種做法不知道可不可行

排兩次序
第一次排序是1,2,3,4 序號A , B, C, D
第二次是 0 ,1,2,3 序號A , B, C, D
然後利用排序相等的方式 1=1 B-A 去算
只是做到這邊我不知道該怎麼做1=1 B-A
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2008-12-19 11:55:10, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-12-19 14:51:23 IP:60.248.xxx.xxx 訂閱
1.SELECT IsNull(a.SN, b.SN+1) SN,   <-- SN 是指我原有TABLE的SN 還是ROW_NUMBER 跑出來的排序呢??
ROW_NUMBER


2.大大後來補充的非連續序號作法...能否提供SQL作法? 目前手中無DELPHI 測試....真不好意思
其實也是把上面那段改成 SQL 字串的方式,在一開始回您的時候就有Sample 了,還是自己手動試試吧

3.以下欄位SEQ,SERIAL_NUMBER,REPAIR_TIME


[code delphi]
SELECT ROW_NUMBER() OVER (ORDER BY REPAIR_TIME) AS SEQ,
SERIAL_NUMBER,REPAIR_TIME
FROM G_SN_REPAIR
[/code]


我是有想過一種做法不知道可不可行

排兩次序
第一次排序是1,2,3,4 序號A , B, C, D
第二次是 0 ,1,2,3 序號A , B, C, D
然後利用排序相等的方式 1=1 B-A 去算
只是做到這邊我不知道該怎麼做1=1 B-A

寫給您的 Sample 就是這種寫法,多看幾遍,您就知道了!!
------
價值的展現,來自於你用哪一個角度來看待它!!
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-12-22 10:16:34 IP:122.116.xxx.xxx 訂閱
DEAR careychen , st33chen 兩位大大
小弟研究了改寫之後,大致上已經可以跑但還是有小問題
1.跑這各函數 DateDiff 都會顯示錯誤 所以小弟就把這項刪掉
2.我已經針對NULL值去填時間了 也就是早上8:00跟下午17:00 (Edit1,Edit2)
但是去做相減...但是第一筆跟最後一筆卻沒有相減的時間
(附圖http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=96620)

3.實際序號只有五筆 可是我跑出來下來又多出一樣的五筆= =
以下是我SQL


[code delphi]
SELECT A.SEQ,A.SERIAL_NUMBER,
NVL(A.REPAIR_TIME,TO_DATE('200812181700','YYYYMMDDHH24MI')) "REPAIR_TIME",
B.SEQ2,B.SERIAL_NUMBER "SERIAL_NUMBER2",
NVL(B.REPAIR_TIME,TO_DATE('200812180800','YYYYMMDDHHMI')) "REPAIR_TIME2",
TRUNC((A.REPAIR_TIME - B.REPAIR_TIME)*1440,2) "TIME"
FROM
(Select Row_Number() over (Order by REPAIR_TIME) SEQ, SERIAL_NUMBER,REPAIR_TIME
from G_SN_REPAIR WHERE RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD') = '20081218'
AND REPAIR_EMP_ID = '10000109') A full join
(Select Row_Number() over (Order by REPAIR_TIME) SEQ2,SERIAL_NUMBER,REPAIR_TIME
from G_SN_REPAIR WHERE RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD') = '20081218'
AND REPAIR_EMP_ID = '10000109') B on A.SEQ=(B.SEQ2 1)
ORDER BY A.SEQ

[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2008-12-22 10:18:12, 註解 無‧
lovemari 重新編輯於 2008-12-22 10:18:56, 註解 無‧
careychen
尊榮會員


發表:41
回覆:580
積分:959
註冊:2004-03-03

發送簡訊給我
#12 引用回覆 回覆 發表時間:2008-12-22 10:39:15 IP:60.248.xxx.xxx 訂閱
這個部份我剛在 MSSQL 試過一樣的語法是正確的,但…在 Oracle  上卻多出五筆,這部份要請 st33chen 前輩幫您試試了,我這邊沒有 Oracle 的環境,抱歉

===================引 用 lovemari 文 章===================
DEAR careychen , st33chen 兩位大大
小弟研究了改寫之後,大致上已經可以跑但還是有小問題
1.跑這各函數 DateDiff 都會顯示錯誤 所以小弟就把這項刪掉
2.我已經針對NULL值去填時間了 也就是早上8:00跟下午17:00 (Edit1,Edit2)
但是去做相減...但是第一筆跟最後一筆卻沒有相減的時間
(附圖http://delphi.ktop.com.tw/board.php?cid=31&fid=130&tid=96620)

3.實際序號只有五筆 可是我跑出來下來又多出一樣的五筆= =
以下是我SQL


[code delphi]
SELECT A.SEQ,A.SERIAL_NUMBER,
NVL(A.REPAIR_TIME,TO_DATE('200812181700','YYYYMMDDHH24MI')) "REPAIR_TIME",
B.SEQ2,B.SERIAL_NUMBER "SERIAL_NUMBER2",
NVL(B.REPAIR_TIME,TO_DATE('200812180800','YYYYMMDDHHMI')) "REPAIR_TIME2",
TRUNC((A.REPAIR_TIME - B.REPAIR_TIME)*1440,2) "TIME"
FROM
(Select Row_Number() over (Order by REPAIR_TIME) SEQ, SERIAL_NUMBER,REPAIR_TIME
from G_SN_REPAIR WHERE RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD') = '20081218'
AND REPAIR_EMP_ID = '10000109') A full join
(Select Row_Number() over (Order by REPAIR_TIME) SEQ2,SERIAL_NUMBER,REPAIR_TIME
from G_SN_REPAIR WHERE RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD') = '20081218'
AND REPAIR_EMP_ID = '10000109') B on A.SEQ=(B.SEQ2 1)
ORDER BY A.SEQ

[/code]
------
價值的展現,來自於你用哪一個角度來看待它!!
st33chen
尊榮會員


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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2008-12-23 10:35:24 IP:122.116.xxx.xxx 未訂閱
您們好,

我建了 TABLE 實測, 的確會多出幾筆資料,
GOOGLE 了一下(我是用 ORACLE FULL JOIN 搜尋的),
發覺應該是 ORACLE 對 FULL JOIN 的定義不符合 SQL 標準,
所以就有人說這是 ORACLE 的 BUG.

我試了一些方法想保留 FULL JOIN 尚不得其門,
所以您的 SQL 指令我改了一下, 我實測可行, 請參考一下:
(我測試時 REPAIR_TIME 是用文字型, 語法和這裡有些不一樣,
COPY 到這裡時不知是否改全了, 請注意一下)

select A.SEQ, A.SERIAL_NUMBER,
A.REPAIR_TIME "REPAIR_TIME", -- 改成用 UNION ALL
B.SEQ2, B.SERIAL_NUMBER "SERIAL_NUMBER2",
B.REPAIR_TIME "REPAIR_TIME2", -- 改成用 UNION ALL
TRUNC((A.REPAIR_TIME - B.REPAIR_TIME)*1440, 2) "TIME"
FROM (
select Row_Number() over (order by REPAIR_TIME) SEQ, SERIAL_NUMBER, REPAIR_TIME
from G_SN_REPAIR
where RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD')='20081218'
AND REPAIR_EMP_ID='10000109'
UNION ALL -- 代替原本的 NVL
SELECT COUNT(*) 1, 'XX', '200812181700'
FROM G_SN_REPAIR
where RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD')='20081218'
AND REPAIR_EMP_ID='10000109'
) A, ( -- 代替原本的 FULL JOIN
select Row_Number() over (order by REPAIR_TIME) SEQ2, SERIAL_NUMBER, REPAIR_TIME
from G_SN_REPAIR
where RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD')='20081218'
AND REPAIR_EMP_ID='10000109'
UNION ALL -- 代替原本的 NVL
SELECT 0, 'XX', '200812180800' FROM DUAL

) B
WHERE A.SEQ=(B.SEQ2 1) -- 代替原本的 ON
order by A.SEQ
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-12-23 10:43:22, 註解 無‧
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#14 引用回覆 回覆 發表時間:2008-12-25 15:29:17 IP:122.116.xxx.xxx 訂閱
謝謝 st33chen 大大

你提出的SQL 我試跑已經不會出現重複的了

只是一開始跑的時候 REPAIR_TIME 像大大說的資料格式不對

修改成下面即可 但是我無法做運算了 是我那裡改的不對嗎??

我的A.REPAIR_TIME 沒有此ID 我改成 跟下面TO_CHAR(REPAIR_TIME,'YYYYMMDD') 也不能執行>//<


[code delphi]
select A.SEQ, A.SERIAL_NUMBER,
//A.REPAIR_TIME "REPAIR_TIME", -- 改成用 UNION ALL
//A.REPAIR_TIME,
B.SEQ2, B.SERIAL_NUMBER "SERIAL_NUMBER2"
//B.REPAIR_TIME "REPAIR_TIME2" -- 改成用 UNION ALL
//B.REPAIR_TIME
//TRUNC((A.REPAIR_TIME - B.REPAIR_TIME)*1440, 2) "TIME"
FROM (
select Row_Number() over (order by REPAIR_TIME) SEQ, SERIAL_NUMBER, TO_CHAR(REPAIR_TIME,'YYYYMMDD')
from G_SN_REPAIR
where RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD')='20081218'
AND REPAIR_EMP_ID='10000109'
UNION ALL // 代替原本的 NVL
SELECT COUNT(*) 1, 'XX', '200812181700'
FROM G_SN_REPAIR
where RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD')='20081218'
AND REPAIR_EMP_ID='10000109'
) A, ( //代替原本的 FULL JOIN
select Row_Number() over (order by REPAIR_TIME) SEQ2, SERIAL_NUMBER, TO_CHAR(REPAIR_TIME,'YYYYMMDD')
from G_SN_REPAIR
where RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD')='20081218'
AND REPAIR_EMP_ID='10000109'
UNION ALL // 代替原本的 NVL
SELECT 0, 'XX', '200812180800' FROM DUAL
) B
WHERE A.SEQ=(B.SEQ2 1) // 代替原本的 ON
order by A.SEQ

[/code]
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2008-12-25 15:30:09, 註解 無‧
st33chen
尊榮會員


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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2008-12-25 18:24:55 IP:118.168.xxx.xxx 未訂閱
因為我不習慣用 DATETIME 型, 測試時用字串型, 
上傳 SQL 時果真疏忽沒改到, SORRY LA, 重傳一次,
(因為測試用的 TABLE 已刪除, 我沒再實測), 希望這回對了.

現在是假設 SERIAL_NUMBER 為字串型, REPAIR_TIME 為 DATETIME 型
因為 UNION ALL 欄位數要一樣, 且相對應的欄位型態要一致,
如果還不對, 您應該可以自行排除.

select A.SEQ, A.SERIAL_NUMBER,
A.REPAIR_TIME "REPAIR_TIME"
B.SEQ2, B.SERIAL_NUMBER "SERIAL_NUMBER2",
B.REPAIR_TIME "REPAIR_TIME2",
TRUNC((A.REPAIR_TIME - B.REPAIR_TIME)*1440, 2) "TIME"
FROM (
select Row_Number() over (order by REPAIR_TIME) SEQ, SERIAL_NUMBER, REPAIR_TIME
from G_SN_REPAIR
where RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD')='20081218'
AND REPAIR_EMP_ID='10000109'
UNION ALL
SELECT COUNT(*) 1, 'XX', TO_DATE('200812181700','YYYYMMDDHH24MI')
FROM G_SN_REPAIR
where RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD')='20081218'
AND REPAIR_EMP_ID='10000109'
) A, (
select Row_Number() over (order by REPAIR_TIME) SEQ2, SERIAL_NUMBER, REPAIR_TIME
from G_SN_REPAIR
where RP_STAGE_ID = '10015'
AND TO_CHAR(REPAIR_TIME,'YYYYMMDD')='20081218'
AND REPAIR_EMP_ID='10000109'
UNION ALL
SELECT 0, 'XX', TO_DATE('200812180800', 'YYYYMMDDHH24MI') FROM DUAL
) B
WHERE A.SEQ=(B.SEQ2 1)
order by A.SEQ
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
lovemari
中階會員


發表:134
回覆:224
積分:76
註冊:2005-08-18

發送簡訊給我
#16 引用回覆 回覆 發表時間:2008-12-26 08:36:13 IP:122.116.xxx.xxx 訂閱
st33chen 大大

非常感謝你
我原本也有想到要改那串數字
看起來好像格格不入
只記得用TO_CHAR 卻忘記TO_DATE
再次萬分感謝兩位^^

careychen 大大

我也是很感謝你 你幫過我不少忙
------
Program : Delphi 7
DataBase : Oracle 9i
Client : ClientDataSet
編輯記錄
lovemari 重新編輯於 2008-12-26 08:36:50, 註解 無‧
st33chen
尊榮會員


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

發送簡訊給我
#17 引用回覆 回覆 發表時間:2008-12-26 08:46:54 IP:122.116.xxx.xxx 未訂閱
lovemari 大大
這題我只是做 CAREYCHEN 大大的翻譯, 把 MSSQL 翻成 ORACLE 而已耶
對 CAREYCHEN 大大不好意思
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-12-26 09:33:09, 註解 無‧
系統時間:2024-04-29 4:41:49
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!