Использование SUM с текстовым содержимым строки на основе формул. Все вместе с WHERE, JOIN, ORDER - PullRequest
2 голосов
/ 16 февраля 2012

Я пишу небольшое приложение о мониторинге запасов для моей компании.Использование mysql и codeigniter 2.1.0.

Две таблицы: поставки и карточки учета

Я благодарен за помощь в построении запроса к списку название акции и оставшееся количество.

Окончательный вывод должен быть: (пожалуйста, смотрите таблицы ниже)

<tr>
  <td>Product Name 1</td>
  <td> 2 pcs </td>
</tr>
<tr>
  <td>Product Name 2</td>
  <td> 5 pcs </td>
</tr>

Я предполагаю, что задачи:

объединить таблицы с id_stock,группа по id_stockв каждой группе получим «каким-то» образом сумму, где direction = rcvdв каждой группе, получить «каким-то образом» сумму количества, где направление = отправлено«как-то» создать новый столбец для каждой группы с rcvd минус отправлено = остальное_квантовостьзаказ по stokcards.name ASC

Мне не удалось создать правильную беллетристику и, более того, правильный синтаксис.Спасибо за любую помощь.

Поставки:

+-------------+----------+-----------+----------+
| id_delivery | id_stock | direction | quantity |
+-------------+----------+-----------+----------+
|    A.I.     |    1     |   rcvd    |     15   |
|             |    1     |   sent    |     13   |
|             |    2     |   rcvd    |     50   |
|             |    2     |   sent    |     45   |
+-------------+----------+-----------+----------+

Stockcards:

+----------+-----------------+
| id_stock |       name      |
+----------+-----------------+
|    1     |  Product Name 1 |
|    2     |  Product Name 2 |
+----------+-----------------+

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012

попробуйте это:

SELECT  DISTINCT a.id_stock, 
        b.`name` as ProductName,
        COALESCE(f.TotalReceived, 0) as TotalReceived, 
        COALESCE(g.TotalSent, 0) as TotalSent,
        (COALESCE(f.TotalReceived, 0) - COALESCE(g.TotalSent, 0)) as RemainingStock
FROM    deliveries a INNER JOIN stockcards b 
            ON a.id_stock = b.id_Stock
        LEFT JOIN 
            (
                SELECT c.id_stock, SUM(c.quantity) TotalReceived
                FROM deliveries c
                WHERE c.direction = 'rcvd'
                GROUP BY c.id_stock
            ) f ON a.id_stock = f.id_stock
        LEFT JOIN
            (
                SELECT d.id_stock, SUM(d.quantity) TotalSent
                FROM deliveries d
                WHERE d.direction = 'sent'
                GROUP BY d.id_stock
            ) g ON a.id_stock = g.id_stock
ORDER BY ProductName ASC
1 голос
/ 16 февраля 2012

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

В качестве ответа для вашей текущей схемы, следующее будет делать, как вы просили

SELECT 
  s.*,
  SUM(COALESCE(d_in.quantity,0))-SUM(COALESCE(d_out.quantity,0)) AS quantiyInStock

FROM stockcards AS s

LEFT JOIN deliveries AS d_in
  ON d_in.id_stock = s.id_stock
  AND d_in.direction = 'rcvd'

LEFT JOIN deliveries AS d_out
  ON d_out.id_stock = s.id_stock
  AND d_out.direction = 'sent'

GROUP BY s.id_stock

Чтобы вышесказанное работало как можно эффективнее, убедитесь, что у вас есть следующий ключ

В таблице «поставки» ключ, состоящий из столбцов («id_stock», «id_direction»)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...