Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Mysql inner join query

Tags:

sql

mysql

I'm using two tables in the database. The first contains data related to the successful and unsuccessful payments while the second table contains data regarding the status of services.

The result of the query should combine both tables and as a result list the successful and unsuccessful payments grouped by the days as well as the status of services grouped by days.

First table looks like:

id | charged |    date
-----------------------------
8  |  OK     |  2011-12-03
7  |  OK     |  2011-12-03
9  |  NO     |  2011-12-03
11 |  OK     |  2011-12-04
14 |  NO     |  2011-12-04

The second table looks like:

id  | status |   date
--------------------------
 8  |   1    | 2011-12-03
 9  |   1    | 2011-12-03
 11 |   0    | 2011-12-04
 12 |   0    | 2011-12-04
 14 |   1    | 2011-12-04

The correct query result should be:

   date    | not_charged | charged | status_1 | status_0  
-----------------------------------------------------------
2011-12-04 |      1      |   1     |    1     |    2
2011-12-03 |      1      |   2     |    2     |    0

The query that I've tried looks like this:

SELECT i.date, SUM(
CASE WHEN i.charged = 'NO'
THEN 1 ELSE 0 END ) AS not_charged, SUM(
CASE WHEN i.charged = 'OK'
THEN 1 ELSE 0 END ) AS charged, SUM(
CASE WHEN s.status = '1'
THEN 1 ELSE 0 END ) AS status_1, SUM(
CASE WHEN s.status = '0' THEN 1 ELSE 0 END ) AS status_0
FROM charge i INNER JOIN status s ON s.date = i.date
GROUP BY i.date

But I get the wrong result that looks like this

   date    | not_charged | charged | status_1 | status_0
---------------------------------------------------------
2011-12-04 |     3       |    3    |    2     |    4
2011-12-03 |     2       |    4    |    6     |    0

What I'm doing wrong and how can I get the correct result?

Thanks for all suggestions.

like image 413
Sergio Avatar asked Aug 05 '26 08:08

Sergio


1 Answers

Try this one -

SELECT date,
  SUM(IF(charged = 'NO', 1, 0)) not_charged,
  SUM(IF(charged = 'OK', 1, 0)) charged,
  SUM(IF(status = 1, 1, 0)) status_1,
  SUM(IF(status = 0, 1, 0)) status_0
FROM (
  SELECT date, charged, NULL status FROM charge
    UNION ALL
  SELECT date, NULL charged, status FROM status
    ) t
  GROUP BY date DESC;

+------------+-------------+---------+----------+----------+
| date       | not_charged | charged | status_1 | status_0 |
+------------+-------------+---------+----------+----------+
| 2011-12-04 |           1 |       1 |        1 |        2 |
| 2011-12-03 |           1 |       2 |        2 |        0 |
+------------+-------------+---------+----------+----------+
like image 115
Devart Avatar answered Aug 06 '26 20:08

Devart



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!