2017-10-18 24 views
0

私はこのクエリを実行使用している場合:発注問題SQL変数

SELECT stockcarddetail.id, stockcarddetail.date, stockcarddetail.quantity, stockcarddetail.pricePerItem 
    FROM Stockcard 
    LEFT JOIN staff 
     ON staff.branchId = stockcard.branchId 
    LEFT JOIN stockcarddetail 
     ON stockcarddetail.stockcardId = stockcard.id 
WHERE staff.username = 'jemmy.h' 
    AND stockcarddetail.quantity > 0 
    AND stockcard.productId = '98924a5f-6afb-11e7-8dd4-2c56dcbcb038' 
ORDER BY date ASC 

と以下の結果を得る:次に

id | date  | quantity| pricePerItem 
50 | 2017-10-15 | 10.00 | 10000.00 
1 | 2017-10-18 | 20.00 | 10000.00 

を、私は、上記の順序に基づい量の累積を計算する必要があります私はこのクエリを実行します。

SELECT a.*, @tot:[email protected] + a.quantity FROM 
(SELECT @tot:= 0)b 
JOIN 
(SELECT stockcarddetail.id, stockcarddetail.date, stockcarddetail.quantity, stockcarddetail.pricePerItem 
FROM Stockcard 
LEFT JOIN staff 
     ON staff.branchId = stockcard.branchId 
LEFT JOIN stockcarddetail 
     ON stockcarddetail.stockcardId = stockcard.id 
WHERE staff.username = 'jemmy.h' 
    AND stockcarddetail.quantity > 0 
    AND stockcard.productId = '98924a5f-6afb-11e7-8dd4-2c56dcbcb038' 
ORDER BY date ASC) a 

その後、私はこの結果を得た:

id | date  | quantity| pricePerItem | @tot 
1 | 2017-10-18 | 20.00 | 10000.00  | 20 
50 | 2017-10-15 | 10.00 | 10000.00  | 30 

はしかし、私が望む結果はこのようなものです:

id | date  | quantity| pricePerItem | @tot 
50 | 2017-10-15 | 10.00 | 10000.00  | 10 
1 | 2017-10-18 | 20.00 | 10000.00  | 30 

どのように私は期待される結果を得ることができますか?

EDIT

問題の簡易版は、ここで見つけることができます:私はあなたから理解して何を、あなたは、各エントリの累積合計をしたいhttp://sqlfiddle.com/#!9/f6ad91/3

+0

であるあなたが本当にLEFT JOINをしたい場合は、WHEREにONから右サイドテーブルの条件を移動します。今のところ、定期的な内部結合の結果が得られます。 – jarlh

+0

あなたのコードを理解したところでは、出力は '10,20'になりません。' 20,30'または '10,30'です。 – Ravi

+0

@Ravi私の悪い、私は10,30を意味します。 –

答えて

1

から。

私は、変数を捨て、代わりにサブクエリに頼る示唆:

SELECT 
scd.id, 
scd.date, 
scd.quantity, 
scd.pricePerItem, 
(SELECT SUM(scd1.quantity) FROM StockcardDetail AS scd1 WHERE scd1.stockcardId = scd.stockcardId AND scd1.date <= scd.date) AS total 
FROM Stockcard 
LEFT JOIN staff ON staff.branchId = stockcard.branchId 
LEFT JOIN stockcarddetail AS scd ON scd.stockcardId = stockcard.id 

WHERE staff.username = 'jemmy.h' 
AND scd.quantity > 0 
AND stockcard.productId = '98924a5f-6afb-11e7-8dd4-2c56dcbcb038' 
ORDER BY scd.date ASC 

この背後にある考え方は、それが各エントリのための前(現在のものを含む)すべてのエントリの合計を選択することです。

+0

それは動作しますが、サブクエリを編集してよりシンプルにしています。 –

+0

@Bla ...ありがとう、私はそれを考えていた可能性があります:p – Magisch

1

私の理解によれば、あなたのクエリから期待される出力を得るべきです。しかし、あなたが期待される出力を取得されていませんし、他の可能な解決策は、(JOINなし)

SET @tot:= 0; 

SELECT 
stockcarddetail.id, 
stockcarddetail.date, 
stockcarddetail.quantity, 
stockcarddetail.pricePerItem, 
@tot:[email protected] + stockcarddetail.quantity as Total 
FROM Stockcard 
LEFT JOIN staff ON staff.branchId = stockcard.branchId 
LEFT JOIN stockcarddetail ON stockcarddetail.stockcardId = stockcard.id 
WHERE staff.username = 'jemmy.h' AND stockcarddetail.quantity > 0 AND stockcard.productId = '98924a5f-6afb-11e7-8dd4-2c56dcbcb038' 
ORDER BY date ASC 
+0

phpmyadminの '@tot:= 0'が表示されます。だから、私は変数にアクセスできると信じて、 'JOIN'を使う必要があります。 –

+0

@Bla ... 'SET @tot:= 0'を' SET @tot:= 0'に変更 – Ravi

+0

@Bla ... http://sqlfiddle.com/#!9/cef3c/7サンプルコード – Ravi