2016-04-21 66 views
-3

费用表中检索多个值单个查询从多个表

1/1/2016 exp1 2000 
13/1/2016 exp11 2500 
1/2/2016 exp2 1500 
1/3/2016 exp3 1000 
10/3/2016 exp1 2000 

收入表

1/1/2016 income1 2500 
1/2/2016 income2 3500 
1/3/2016 income3 1500 
10/3/2016 income3 1000 
1/4/2016 income4 5000 

从单查询我需要的是按月组,这是我需要的

Expenses Incomes Month 
4500  2500 Jan 
1500  3500 Feb 
3000  2500 Mar 
0  5000 April 

我需要上述查询才能显示Google图表中的数据

+2

解释什么是关系。 \t请阅读[**如何提问**](http://stackoverflow.com/help/how-to-ask) \t \t这里是[** START **]( http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)了解如何提高您的问题质量并获得更好的答案。 –

+1

请添加您要查找的完整表格结构和预期的表格/行。还包括你到目前为止尝试过的代码。有关如何提出良好问题的详细信息,请参阅http://stackoverflow.com/help/how-to-ask。 – Technoh

+0

在弄清楚如何编写查询之后,将其放入Google图表中是一项完全不同的任务。你将需要尝试代码,然后问一个新的详细问题,如果它不起作用(以你尝试过的样本为例)。 –

回答

0

可怕的数据结构和格式,但不是不可能的:这个简单的

SELECT 
    IFNULL(exp.Expenses,0) Expenses, 
    IFNULL(inc.Incomes,0) Incomes, 
    inc.`monthname` `Month` 
FROM 
    (
     SELECT 
      SUM(i.amount) Incomes, 
      MONTHNAME(STR_TO_DATE(i.`date`, '%d/%m/%Y')) `monthname`, 
      MONTH(STR_TO_DATE(i.`date`, '%d/%m/%Y')) `month` 
     FROM 
      incomes i 
     GROUP BY 
      MONTHNAME(STR_TO_DATE(i.`date`, '%d/%m/%Y')), 
      MONTH(STR_TO_DATE(i.`date`, '%d/%m/%Y')) 
    ) inc 

LEFT JOIN 

    (
    SELECT 
     SUM(e.amount) Expenses, 
     MONTHNAME(STR_TO_DATE(e.`date`, '%d/%m/%Y')) `monthname`, 
     MONTH(STR_TO_DATE(e.`date`, '%d/%m/%Y')) `month` 
    FROM 
     expenses e 
    GROUP BY 
     MONTHNAME(STR_TO_DATE(e.`date`, '%d/%m/%Y')), 
     MONTH(STR_TO_DATE(e.`date`, '%d/%m/%Y')) 
    ) exp 
ON exp.`month` = inc.`month` 

ORDER BY 
    inc.`month` 

输出:

+----------+---------+----------+ 
| Expenses | Incomes | Month | 
+----------+---------+----------+ 
| 4500  | 2500 | January | 
| 1500  | 3500 | February | 
| 3000  | 2500 | March | 
| 0  | 5000 | April | 
+----------+---------+----------+ 
4 rows in set 

反正好东西认真如何改进和规范你的数据

+0

你可以让我知道我的表格结构有什么问题。我刚刚创建了两个表格。 1费用和1收入。你有什么建议? – JSN

0

在我的解决方案中,我给出了月份的数字而不是文本。如果你愿意的话,我会把它转换成文本(例如使用CASE表达式):

SELECT 
    sum(expense) AS total_expense, sum(income) AS total_income, trans_month 
FROM (
    SELECT 
     month(trans_date) AS trans_month, 
     0 AS income, 
     sum(amount) AS expense 
    FROM expense 
    GROUP BY month(trans_date) 
    UNION ALL 
    SELECT 
     month(trans_date) AS trans_month, 
     sum(amount) AS income, 
     0 AS expense 
    FROM income 
    GROUP BY month(trans_date) 
) AS a 
GROUP BY trans_month; 
+0

很多谢谢,它的工作 – JSN