環境: 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
...
規則:
我有實作出來如下:
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
生產入庫單據 抓最後一筆生產日庫來參照
(你可以舉一反三)
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]