Я разработал систему обработки кассира около 6 лет назад, и хотя код выглядит мрачным и ужасным, он все еще работает, и кафе, для которого я его разработал, все это время использовал.
Тем не менее, они недавно приобрели карточный автомат, и поэтому теперь, когда они хотят просмотреть все продажи за день, когда они хотят увидеть наличные против карты в двух отдельных таблицах.
Это сложно, и SQL дляэто ставит меня в тупик - я не могу обдумать это.
Вот эти таблицы:
категории
+----+-------------------+---------+------------+
| id | name | display | ts |
+----+-------------------+---------+------------+
| 1 | Drinks | 1 | 2016-10-14 |
| 2 | General Snacks | 1 | 2016-10-14 |
| 3 | Lunch Options | 1 | 2016-10-14 |
| 4 | Conference Drinks | 1 | 2016-10-14 |
+----+-------------------+---------+------------+
продукты
+----+-----------------+-------+------+-----+---------+------------+
| id | name | price | cost | cID | display | ts |
+----+-----------------+-------+------+-----+---------+------------+
| 1 | English Tea | 0.6 | 0.09 | 1 | 1 | 2018-02-15 |
| 2 | Speciality Teas | 0.8 | 0.17 | 1 | 1 | 2018-02-15 |
| 3 | Crisps | 0.6 | 0.41 | 3 | 1 | 2018-02-15 |
| 4 | Chocolate Bar | 0.6 | 0.5 | 3 | 1 | 2018-02-15 |
+----+-----------------+-------+------+-----+---------+------------+
квитанции
+----+-----+-----+----------+------------+
| id | oID | pID | quantity | ts |
+----+-----+-----+----------+------------+
| 1 | 1 | 26 | 1 | 2013-11-21 |
| 2 | 2 | 6 | 2 | 2013-11-21 |
| 3 | 3 | 2 | 1 | 2013-11-21 |
| 4 | 4 | 3 | 1 | 2013-11-21 |
+----+-----+-----+----------+------------+
продажи
+----+-------+----------+------+------+--------+------------+
| id | total | tendered | flag | card | userID | ts |
+----+-------+----------+------+------+--------+------------+
| 1 | 1 | 1 | 0 | 0 | 4 | 2013-11-21 |
| 2 | 2 | 2 | 0 | 0 | 4 | 2013-11-21 |
| 3 | 0.6 | 0.6 | 0 | 0 | 4 | 2013-11-21 |
| 4 | 0.6 | 0.6 | 0 | 0 | 4 | 2013-11-21 |
+----+-------+----------+------+------+--------+------------+
Пожалуйста, имейте в виду, что я написал это давным-давно, и я знаю, что это не идеально.Просто для объяснения вышесказанного, oID
означает orderID
, но на самом деле должно быть salesID
и связано с идентификатором таблицы продаж, а pID
означает productID
и является внешним ключом, связывающим таблицу products
,Точно так же cID
на самом деле categoryID
.
Хорошо. Итак, менеджер кафе запросил таблицу, которая выглядит следующим образом:
+---------------+-----+------+-------+------------+-----------+
| Drinks | Qty | Cost | Price | Cost-Total | Qty-total |
+---------------+-----+------+-------+------------+-----------+
| Juice Carton | 2 | 33p | 60p | 66p | £1.20 |
| Filter Coffee | 11 | 20p | 80p | £2.20 | £8.80 |
| Sub Total | 13 | | | £2.86 | £10.00 |
| Grand Total | 13 | | | £2.86 | £10.00 |
+---------------+-----+------+-------+------------+-----------+
Что было хорошо, я использовалследующий SQL-оператор для этого:
SELECT
categories.name AS category, products.name, pID,
(SELECT SUM(quantity) FROM receipts s WHERE s.pID = r.pID AND DATE(s.ts) = CURDATE()) AS quantity,
products.price,
products.cost
FROM receipts r
LEFT JOIN products ON r.pID = products.id
LEFT JOIN categories ON products.cID = categories.id
WHERE DATE(r.ts) = CURDATE()
GROUP BY r.pID ORDER BY categories.name;
Однако теперь мне нужно отобразить две таблицы, одну для карты и одну для наличных.Теперь платежи по карте отмечены в таблице sales
с помощью 1
в столбце карты.Поэтому я попытался написать это:
SELECT
categories.name AS category, products.name, pID,
(SELECT SUM(quantity) FROM receipts s WHERE s.pID = r.pID AND DATE(s.ts) = CURDATE()) AS quantity,
products.price,
products.cost
FROM receipts r
LEFT JOIN products ON r.pID = products.id
LEFT JOIN sales x on r.oID = x.id
LEFT JOIN categories ON products.cID = categories.id
WHERE DATE(r.ts) = CURDATE() AND x.card = 1
GROUP BY r.pID ORDER BY categories.name;
Однако он просто отображает те же данные, что и первый запрос.Я знаю, в чем проблема - во встроенном операторе SELECT (AS quantity
), поскольку там я не уточняю, является ли это платежом по карте или наличным платежом.Я думал, что просто добавив x.card = 1
a, конец сделает это, но, очевидно, нет.
Может кто-нибудь помочь мне решить эту проблему SQL?Как я могу получить состояние карты во встроенном SQL, так как она извлекает из квитанций, а квитанции не содержат информацию о том, является ли платеж карточкой или нет?
Я заблудился относительно того, как действовать на самом деле,Вся помощь будет оценена!