2016-02-03 53 views
0

有誰知道MySQL和Firebird的集合函數FIRST和LAST的等價性。我有這樣的庫存主表看起來像這樣:什麼是火鳥的MySQL中FIRST和LAST的等價函數

DATE  |ITEM_CODE  | BEG | + | - | - | - | + | + | + | + | - | - | END 
2015-10-27 | 000000000MS016 |12.5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 12.5 
2015-10-27 | 000000000PN044 | 0 |10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 10 
2015-10-27 | 000000000VI064 | 440 | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 445 
2015-10-27 | 000000000VI029 | 274 | 0 | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 269 

2015-10-28 | 000000000MS016 |12.5 |20 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 32.5 
2015-10-28 | 000000000PN044 | 10 |50 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 60 
2015-10-28 | 000000000VI064 | 445 | 0 | 0 |10 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 435 
2015-10-28 | 000000000VI029 | 269 | 0 | 0 | 0 |20 | 0 | 0 | 0 | 0 | 0 | 0 | 249 

2015-10-29 | 000000000MS016 |32.5 | 0 |10 | 0 | 0 | 0 | 0 | 0 |30 | 0 | 5 | 47.5 
2015-10-29 | 000000000PN044 | 60 | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 65 
2015-10-29 | 000000000VI064 | 435 | 0 | 0 | 0 | 0 |10 | 0 | 0 | 0 | 8 | 0 | 437 
2015-10-29 | 000000000VI029 | 249 |35 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 4 | 280 

2015-10-30 | 000000000MS016 |47.5 | 0 |15 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 32.5 
2015-10-30 | 000000000PN044 | 65 | 5 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | 0 | 65 
2015-10-30 | 000000000VI064 | 437 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 437 
2015-10-30 | 000000000VI029 | 280 | 0 | 5 | 0 | 5 | 0 | 0 | 6 | 0 | 3 | 0 | 273 

,我有這個SELECT條款:

SELECT 
    INV.ITEM_CODE, 
    FIRST(INV.BEG_QTY) AS BEG_QTY, 
    SUM(INV.REC_QTY) AS REC_QTY, 
    SUM(INV.RET_QTY) AS RET_QTY, 
    SUM(INV.SOLD_QTY) AS SOLD_QTY, 
    SUM(INV.BO_QTY) AS BO_QTY, 
    SUM(INV.ADJ_QTY) AS ADJ_QTY, 
    SUM(INV.COUNT_P) AS COUNT_P, 
    SUM(INV.COUNT_C) AS COUNT_C, 
    SUM(INV.TRANS_IN) AS TRANS_IN, 
    SUM(INV.TRANS_OUT) AS TRANS_OUT, 
    SUM(INV.DELIVERY) AS DELIVERY, 
    LAST(INV.END_QTY) AS END_QTY 
FROM INV_MASTER INV 
WHERE (INV.INV_DATE BETWEEN '2015-10-27' AND '2015-10-31') 
GROUP BY INV.ITEM_CODE 
ORDER BY INV.ITEM_CODE 

,結果應該是這樣的:

ITEM_CODE  | BEG | + | - | - | - | + | + | + | + | - | - | END  
000000000MS016 |12.5 |20 |25 | 0 | 0 | 0 | 0 | 0 |30 | 0 | 5 | 32.5 
000000000PN044 | 0 |70 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 5 | 0 | 65 
000000000VI064 | 440 | 5 | 0 |10 | 0 |10 | 0 | 0 | 0 | 8 | 0 | 437 
000000000VI029 | 274 |35 |10 | 0 |25 | 0 | 0 | 6 | 0 | 3 | 4 | 273 

但我m有FIRST和LAST聚合函數的問題,我使用的是firebird v2.5。我怎樣才能做到這一點?

+0

FIRST&LAST不是標準的,因爲表中沒有順序,只有在一個外部ORDER BY之後的最終結果。你知道他們從哪個版本的SQL?你期望他們做什麼?爲什麼不使用DATE的MIN&MAX? – philipxy

+0

@philipxy我只是在某處讀過它,FIRST應該得到它從結果中得到的第一個值(在我的案例中是來自INV_DATE 2015-10-27的值),最後應該得到最後一個值( 'INV_DATE 2015-10-30')。所以你認爲應該是我的問題? –

+0

你還沒有清楚說明「第一」和「最後」是什麼意思。當表格無序時,什麼是「第一價值」?也許涉及到日期?您的輸入是否以某種方式排列,並且您正在呼籲該訂單?我仍然無法看到你的輸出是輸入的函數。請結束以下語句:當...&同時輸入時,行屬於所需的輸出。 – philipxy

回答

0

你應該能夠

(SELECT END_QTY FROM INV_MASTER 
    WHERE ITEM_CODE = INV.ITEM_CODE 
    AND INV_DATE = MAX(INV.INV_DATE)) AS END_QTY 

更換使用LAST這將選擇當前項目的END_QTY,與該項目的最高日期。

+0

耶!有效!非常感謝,@MarkRotteveel:3 –

相關問題