2013-12-19 29 views
0

我得到了包含庫存數據的MySQL表,每個季度我添加具有上次採集的值的行。比較最後兩行的值

今天:

 
+--------------+-------------------+ 
| Quarter  | Value    | 
+--------------+-------------------+ 
|2012.Q4  |17000    | 
|2013.Q1  |18000    | 
|2013.Q2  |19000    |x 
|2013.Q3  |26600    |x 
+--------------+-------------------+ 

下個季度,我會得到

 
+--------------+-------------------+ 
| Quarter  | Value    | 
+--------------+-------------------+ 
|2012.Q4  |17000    | 
|2013.Q1  |18000    | 
|2013.Q2  |19000    | 
|2013.Q3  |26600    |x 
|2014.Q1  |20000    |x 
+--------------+-------------------+ 

我需要計算的最後兩行之間的差異,值和百分比每個季度

  • 今天,預期的結果是7600(+ 40%)(四捨五入)
  • 下一頁季度,預期的結果是-6600(-25%)(四捨五入)

提前致謝。

回答

1

,您可以嘗試這樣

SELECT SUM(CASE WHEN rnum = 2 THEN -1 * value ELSE value END) diff_value, 
     ROUND(SUM(CASE WHEN rnum = 2 THEN -1 * value ELSE value END)/
      SUM(CASE WHEN rnum = 1 THEN 0 ELSE value END) * 100) diff_percent 
    FROM 
(
    SELECT quarter, value, @n := @n + 1 rnum 
    FROM table1 CROSS JOIN (SELECT @n := 0) i 
    ORDER BY quarter DESC 
    LIMIT 2 
) q 

這裏是SQLFiddle演示(季度) 輸出:

 
| DIFF_VALUE | DIFF_PERCENT | 
|------------|--------------| 
|  7600 |   40 | 

這裏是SQLFiddle演示(下一季度) 輸出:

 
| DIFF_VALUE | DIFF_PERCENT | 
|------------|--------------| 
|  -6600 |   -25 | 
+0

+1:起初我以爲這總是要掃描整個桌子,然後我仔細閱讀,看到了「LIMIT 2」。這怎麼可能被推廣到一個也有'顧客'專欄的情況呢? *(要根據每個客戶獲取這些值,並且每個客戶可能沒有相同季度的數據?)* – MatBailie

+0

Top!現在很清楚,很多感謝您的幫助! – Jays

1

MySQL沒有像窗口功能奢侈品,但你可以使用相關子查詢找到某些項目。

SELECT 
    previous_quarter.value       AS previous_value, 
    current_quarter.value       AS current_value, 
    current_quarter.value - previous_quarter.value AS change_in_value 
FROM 
    yourTable AS current_quarter 
INNER JOIN 
    yourTable AS previous_quarter 
    ON previous_quarter.quarter = (SELECT MAX(yourTable.quarter) 
            FROM yourTable 
            WHERE yourTable.quarter < current_quarter.quarter 
           ) 
WHERE 
    current_quarter.quarter = (SELECT MAX(yourTable.quarter) 
           FROM yourTable 
          ) 
+0

編輯改變'<=''到<'在相關聯的子查詢。 – MatBailie