2016-04-21 3 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 Пожалуйста, прочитайте [** How-to-Ask **] (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

Terrible структура данных и формат, но не невозможно:

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

Смежные вопросы