2010-09-28 71 views
2

我的問題涉及到每個月到每月的數據變化..我想要一個簡單的(如果可能的話)SQL查詢將顯示人,月份變化按人/月或類似分組..重要的部分是顯示收益和損失。MySQL如何顯示月份上漲或下跌?

比如我有一個表:(日期簡體)

id | Date  | Person | Sales 
---|-----------|--------| ----- 
1 | 2010-9-01 | Alice | 5 
2 | 2010-8-01 | Alice | 2 

3 | 2010-9-01 | Peter | 2 
4 | 2010-8-01 | Peter | 3 

5 | 2010-9-01 | Bob | 5 
6 | 2010-8-01 | Bob | 7 

從這個表,我希望得到這樣一個報告。

Month | Person | Sales_total | Gain-Loss_from_Previous_month | 
------ -------- ------------- ------------------------------- 
2010-9 Alice  7    +3 
2010-9 Peter  5    -1 
2010-9 Bob   12   -2 

這可以做爲純MySQL查詢嗎? Ø

回答

2

你可能想嘗試像下面這樣的東西:

SELECT  CONCAT(YEAR(s1.date), '-', MONTH(s1.date)) month, 
      s1.person, 
      s2.total_sales sales_total, 
      s1.sales - s3.sales gain_loss 
FROM  sales s1 
JOIN  (
       SELECT person, SUM(sales) total_sales FROM sales GROUP BY person 
      ) s2 ON (s2.person = s1.person) 
LEFT JOIN sales s3 ON 
      (s3.date = DATE_SUB(s1.date, INTERVAL 1 MONTH) AND s3.person = s1.person) 
WHERE  s1.date = STR_TO_DATE(CONCAT('01-', MONTH(NOW()), '-', YEAR(NOW())), '%d-%m-%Y') 
GROUP BY s1.person, s1.date 
ORDER BY s1.person, s1.date; 

WHERE條款部分,其中​​基本上限制s1.date當前的月份和年份。我有一種感覺,有一個更好的解決方案,但目前我想不出一個合適的替代方案。

測試用例:

CREATE TABLE sales (id int, date date, person varchar(40), sales int); 

INSERT INTO SALES VALUES (1, '2010-9-01', 'Alice', 5); 
INSERT INTO SALES VALUES (2, '2010-8-01', 'Alice', 2); 
INSERT INTO SALES VALUES (3, '2010-9-01', 'Peter', 2); 
INSERT INTO SALES VALUES (4, '2010-8-01', 'Peter', 3); 
INSERT INTO SALES VALUES (5, '2010-9-01', 'Bob', 5); 
INSERT INTO SALES VALUES (6, '2010-8-01', 'Bob', 7); 

結果:

+--------+--------+-------------+-----------+ 
| month | person | sales_total | gain_loss | 
+--------+--------+-------------+-----------+ 
| 2010-9 | Alice |   7 |   3 | 
| 2010-9 | Bob |   12 |  -2 | 
| 2010-9 | Peter |   5 |  -1 | 
+--------+--------+-------------+-----------+ 
3 rows in set (0.00 sec) 
0

如果你只是想比較的兩個月裏,這裏是一個相對簡單的查詢:

SELECT '2010-9' month, 
     s1.person, 
     sum(s1.sales) sales_total, 
     sum(s1.sales * (case when MONTH(s1.date) = 8 then -1 else 1 end)) gain_loss 
FROM  sales s1 
WHERE s1.date >= STR_TO_DATE('01-08-2010', '%d-%m-%Y') AND 
     s1.date < STR_TO_DATE('01-10-2010', '%d-%m-%Y') 
GROUP BY s1.person