iT邦幫忙

0

MSSQL2000 子查詢&自訂函數的的問題

  • 分享至 

  • xImage

環境: MS SQL 2000

原始資料如下:
客戶代號_品號_報價單別_報價單號_報價日期_單價
...
AB0001 S002 360 2012020078 2012/02/13 13.00
AB0001 S002 360 2012020037 2012/02/07 15.00
AB0001 S002 360 2012020015 2012/01/23 14.00
...
(客戶代號、品號未必相同)

需求報表結果:
客戶代號_品號_報價單別_報價單號_最近報價日_最近報價
AB0001 S002 360 2012020078 2012/02/07 15.00
AB0001 S002 360 2012020037 2012/02/13 13.00
AB0001 S002 360 2012020015 2012/02/13 13.00
...

規則:

  1. 最近報價日, 最近報價 不取本身, 故報價單號 78的單子,則取 37單子的報價日期、單價
  2. 「最近」的定義,為自今日算起往前找(和報價日期無關),故37和15的單子,其報價日期、單價均取78的單子

我有實作出來如下:
select o.客戶代號,o.品號,o.報價單別,o.報價單號,
最近報價日=func_取最近報價日(o.客戶代號,o.品號,o.報價單別,o.報價單號)
最近報價=func_取最近報價(o.客戶代號,o.品號,o.報價單別,o.報價單號)
from #org o
order by o.報價單別,o.報價單號,o.品號

問題1: 用子查詢會很慢
我想將function改寫為傳回table的方式,一次傳回2欄,這樣可以少一個function,會快些,如下:
func_找最近報價資料(o.客戶代號,o.品號,o.報價單別,o.報價單號)
出現error:
伺服器: 訊息 170,層級 15,狀態 1,行 12
Line 12: Incorrect syntax near '.'.
表示SQL自訂函數(傳回資料集)不接受變數! 因為我用實際資料去測該函數,是可用的!
怎麼辦?

問題2: 是否有不用子查詢的作法,會更快!
謝謝!

範例如下:
CREATE TABLE #org
(
客戶代號 VARCHAR(06),
品號 VARCHAR(20),
報價單別 CHAR(3),
報價單號 CHAR(10),
報價日期 DATETIME ,
單價 DECIMAL(10,3)
)

insert #org values('AB0001','S002','360','2012020078','2012/02/13','13.00')
insert #org values('AB0001','S002','360','2012020037','2012/02/07','15.00')
insert #org values('AB0001','S002','360','2012020015','2012/01/23','14.00')

select * from #org

lionab iT邦新手 2 級 ‧ 2012-03-06 14:26:40 檢舉
規則二看不懂.
是不是等於, 取最新報價日及報價, 但不包括自己本身.
也就是說, 除了78 會取到 15元以外 ,其他任何報價單的最新日及報價都是 2/13 , 13元.
symis iT邦新手 3 級 ‧ 2012-03-16 09:12:23 檢舉
symis提到:
需求報表結果

78的單子,則取 37, 37和15的單子,其報價日期、單價均取78, 請看:需求報表結果
謝謝!
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

4
Albert
iT邦高手 1 級 ‧ 2012-03-06 14:07:31
最佳解答

生產入庫單據 抓最後一筆生產日庫來參照

(你可以舉一反三)

SELECT f.[FI102] AS '工單',f.[FI105] AS 'AcctDate',f.[FI106] AS 'BarCode',
xf.[FI105] AS '最近AcctDate',xf.[FI106] AS '最近BarCode',
f.[FI107] AS 'ItemCode',f.[FI108] AS 'ItemName',f.[FI123] AS 'UOM',
f.[FI103] AS 'Location',f.[FI117] AS 'Qty'
FROM [@FinishItem2] f
INNER JOIN
(SELECT DISTINCT FI101,FI102,FI103,FI104,FI105,FI106,FI107 FROM [@FinishItem2] x WHERE x.FI103 in ('1','2','3','4')
and x.[FI106]=
(SELECT MAX(xx.[FI106]) FROM [@FinishItem2] xx WHERE xx.FI103 in ('1','2','3','4') and x.[FI102]=xx.[FI102] and x.[FI107]=xx.[FI107])
) xf ON xf.[FI107]=f.[FI107] --ItemCode
AND xf.[FI102]=f.[FI102] --工單
WHERE f.FI103 in ('1','2','3','4') -- and f.[FI105] <> xf.[FI105]

看更多先前的回應...收起先前的回應...
Albert iT邦高手 1 級 ‧ 2012-03-06 14:30:52 檢舉

albertachen提到:
產入庫單據 抓最後一筆生產 [入] 庫 資料來參照

Albert iT邦高手 1 級 ‧ 2012-03-06 14:33:17 檢舉

入庫單 抓 入庫單
同一工單
同一成品編號
最後一筆序號 (條碼編號)
來參照

Albert iT邦高手 1 級 ‧ 2012-03-08 06:48:14 檢舉

這是 SAP B1 的統計分析
我们是 SAP B1/ECC6.0/ECC7.0 ADdempiere 對通的專家
Skype: ADempiere/Compiere
Albert

symis iT邦新手 3 級 ‧ 2012-03-16 09:08:10 檢舉

您的方法,雖然也有子查詢,但應該會比我的要快一點,感謝賜教!

我要發表回答

立即登入回答