Выбор данных с MySQL - PullRequest
       2

Выбор данных с MySQL

0 голосов
/ 28 декабря 2018

У меня небольшая задача, которую нужно решить в запросе, у меня есть следующий запрос:

SELECT SUM(total) AS total, products, DATE_FORMAT(TransDate, '%M') AS month
FROM orders
WHERE Status = 'paid'
AND YEAR(TransDate) = '2016'
GROUP BY Product, YEAR(TransDate), MONTH(TransDate)
ORDER BY TransDate ASC

Мой ответ на этот запрос:

<table border=1>
<tr>
  <th>total</th>
  <th>Product</th>
  <th>Month</th>
</tr>

<tr>
  <td>12000</td>
  <td>Ford Mondeo</td>
  <td>Jan</td>
</tr>
<tr>
  <td>23000</td>
  <td>Camaro</td>
  <td>Jan</td>
</tr>
<tr>
  <td>9000</td>
  <td>Golf</td>
  <td>Jan</td>
</tr>
<tr>
  <td>42000</td>
  <td>Audi A4</td>
  <td>Jan</td>
</tr>


<tr>
  <td>4566</td>
  <td>Ford Mondeo</td>
  <td>Feb</td>
</tr>
<tr>
  <td>35435</td>
  <td>Camaro</td>
  <td>Feb</td>
</tr>
<tr>
  <td>58456</td>
  <td>Golf</td>
  <td>Feb</td>
</tr>
<tr>
  <td>56465</td>
  <td>Audi A4</td>
  <td>Feb</td>
</tr>


<tr>
  <td>3522</td>
  <td>Ford Mondeo</td>
  <td>Mar</td>
</tr>
<tr>
  <td>468132</td>
  <td>Camaro</td>
  <td>Mar</td>
</tr>
<tr>
  <td>25225</td>
  <td>Golf</td>
  <td>Mar</td>
</tr>
<tr>
  <td>54612</td>
  <td>Audi A4</td>
  <td>Mar</td>
</tr>


<tr>
  <td>12000</td>
  <td>Ford Mondeo</td>
  <td>Apr</td>
</tr>
<tr>
  <td>23000</td>
  <td>Camaro</td>
  <td>Apr</td>
</tr>
<tr>
  <td>9000</td>
  <td>Golf</td>
  <td>Apr</td>
</tr>
<tr>
  <td>42000</td>
  <td>Audi A4</td>
  <td>Apr</td>
</tr>
<tr>
  <td>54554</td>
  <td>Beatle</td>
  <td>Apr</td>
</tr>

<tr>
  <td>12000</td>
  <td>Ford Mondeo</td>
  <td>May</td>
</tr>
<tr>
  <td>23000</td>
  <td>Camaro</td>
  <td>May</td>
</tr>
<tr>
  <td>9000</td>
  <td>Golf</td>
  <td>May</td>
</tr>
<tr>
  <td>42000</td>
  <td>Audi A4</td>
  <td>May</td>
</tr>
<tr>
  <td>54554</td>
  <td>Beatle</td>
  <td>May</td>
</tr>
</table>

Что происходит в моем случае, так это то, что у машины "битл" есть только продажные значения за последние два месяца, а в предыдущие месяцы нет, я хотел бы знать, есть ли какие-либоспособ, которым он появлялся в другие месяцы с общей стоимостью 0, и в те месяцы, когда автомобиль фактически был продан, его полная стоимость верна.

Большое спасибо за помощь

1 Ответ

0 голосов
/ 28 декабря 2018

Используйте cross join для генерации всех комбинаций продукта / даты.Затем используйте left join для ввода информации о заказах.Вы можете получить даты, используя подзапрос на orders, если у вас нет другого удобного метода (скажем, календарной таблицы):

SELECT ym.yyyymm, p.product, COALESCE(SUM(o.total), 0) AS total
FROM (SELECT DISTINCT DATE_FORMAT(TransDate, '%M') as yyyymm,
             YEAR(TransDate) as yyyy, MONTH(TransDate) as mm
      FROM orders o
      WHERE TransDate >= '2016-01-01' and TransDate < '2017-01-01'
     ) ym CROSS JOIN
     (SELECT DISTINCT o.product FROM orders o
     ) p LEFT JOIN
     orders o
     ON YEAR(o.TransDate) = ym.yyyy AND
        MONTH(o.TransDate) = ym.mm AND
        o.product = p.product AND
        o.Status = 'paid'
GROUP BY p.Product, ym.yyyymm
ORDER BY MIN(o.TransDate), p.Product;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...