簡體   English   中英

限制每個組的記錄,然后平均MySQL的總體結果

[英]Limit records for each group before averaging the results overall MySQL

我有一個具有以下結構的表:

doc_date date, doc_type varchar, code int primary key, qty int, price double 

代碼范圍為1-10; doc_type包括LP,FP,CAS,CRS;

我想查詢該表以獲得每個代碼的最新( doc_date降序)N條記錄,其中doc_type是“ LP ”或“ FP ”,然后是平均價格

除了在平均價格之前限制每個代碼的記錄之外,我已經能夠做我需要做的所有事情。

我的查詢是:

SELECT a.sfcode, a.productname, COALESCE((b.QTY - COALESCE(c.QTY,0)),0) AS currentstock, a.lastprice AS lprice, COALESCE(CAST(d.price AS decimal(16,3)),0) AS sprice, COALESCE(CAST(e.price AS decimal(16,3)),0) AS cprice FROM 

(SELECT sfcode, productname, lastprice FROM products) AS a LEFT JOIN 

(SELECT sfcode, SUM(COALESCE(QTY, 0)) AS QTY FROM transactions WHERE doctype IN ('FP','LP','CSR') GROUP BY sfcode) AS b ON a.sfcode = b.sfcode LEFT JOIN 

(SELECT sfcode, SUM(QTY) AS QTY FROM transactions WHERE doctype IN ('FPR','LPR','CAS','CRS') GROUP BY sfcode) AS c ON a.sfcode = c.sfcode LEFT JOIN 

(SELECT sfcode, AVG(unitprice) AS price FROM transactions WHERE doctype IN ('CAS', 'CRS') GROUP BY sfcode) AS d ON a.sfcode = d.sfcode LEFT JOIN 

(SELECT sfcode, AVG(unitprice) AS price FROM transactions WHERE doctype IN ('FP', 'LP') GROUP BY sfcode) AS e ON a.sfcode = e.sfcode ORDER BY sfcode;

查詢的最后2行是我需要在價格平均之前按日期的降序限制記錄的位置

我已經搜索過此文件,並找到了http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/在哪里獲得有限的行,但我不知道如何添加doc_type子句並根據desc日期獲取結果。

鏈接到sqlfiddle http://sqlfiddle.com/#!2/4778b/1

我希望結果看起來像這樣..當限制設置為3時:

| sfcode | stock | lprice | sprice | cprice |
|    1   |   40  | 15.000 | 0.000  | 9.667  |
|    2   |   80  | 25.000 | 0.000  | 19.667 |
|    3   |  120  | 35.000 | 0.000  | 29.66  |
|    4   |  160  | 45.000 | 0.000  | 39.667 |
|    5   |  200  | 55.000 | 0.000  | 49.667 |
|    6   |   0   | 65.000 | 0.000  | 0.000  |
|    7   |   0   | 75.000 | 0.000  | 0.000  |
|    8   |   0   | 85.000 | 0.000  | 0.000  |
|    9   |   0   | 95.000 | 0.000  | 0.000  |
|   10   |   0   |105.000 | 0.000  | 0.000  |

因此,根據您提供的鏈接 ,您可以將查詢更改為

set @row_limit = 3;
set @row_num = 0;
set @code = -1;

SELECT a.sfcode, COALESCE((b.QTY - COALESCE(c.QTY,0)),0) AS currentstock, 
a.lastprice AS lprice, COALESCE(CAST(d.price AS decimal(16,3)),0) AS sprice,
COALESCE(CAST(e.price AS decimal(16,3)),0) AS cprice FROM 
(SELECT sfcode, lastprice FROM products) AS a LEFT JOIN
(SELECT sfcode, SUM(COALESCE(QTY, 0)) AS QTY 
    FROM transactions 
    WHERE doctype IN ('FP','LP','CSR') 
    GROUP BY sfcode) AS b ON a.sfcode = b.sfcode LEFT JOIN
(SELECT sfcode, SUM(QTY) AS QTY 
    FROM transactions 
    WHERE doctype IN ('FPR','LPR','CAS','CRS') 
GROUP BY sfcode) AS c ON a.sfcode = c.sfcode LEFT JOIN 
(SELECT sfcode, AVG(unitprice) AS price 
FROM (SELECT sfcode, unitprice, 
    @row_num := if(@code = sfcode, @row_num + 1, 0) AS rowNumber, 
    @code := sfcode AS code 
    FROM transactions 
    WHERE doctype IN ('CAS', 'CRS') 
    ORDER BY sfcode, docdate DESC) AS f 
WHERE f.rowNumber < @row_limit GROUP BY sfcode) 
AS d ON a.sfcode = d.sfcode 
LEFT JOIN (SELECT sfcode, AVG(unitprice) AS price 
FROM **(SELECT sfcode, unitprice, 
    @row_num := if(@code = sfcode, @row_num + 1, 0) as rowNumber, 
    @code := sfcode AS code 
    FROM transactions 
    WHERE doctype IN ('FP', 'LP') 
    ORDER BY sfcode, docdate DESC) AS g** 
WHERE g.rowNumber < @row_limit GROUP BY sfcode) 
AS e ON a.sfcode = e.sfcode ORDER BY sfcode;

其中@row_limit設置為您希望收集的最新事務數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM