Отображать только платежи по карте - PullRequest
2 голосов
/ 19 сентября 2019

Я разработал систему обработки кассира около 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, так как она извлекает из квитанций, а квитанции не содержат информацию о том, является ли платеж карточкой или нет?

Я заблудился относительно того, как действовать на самом деле,Вся помощь будет оценена!

1 Ответ

0 голосов
/ 19 сентября 2019

В базовой форме:

SELECT * FROM Sales WHERE card = 1

Будут отображаться только платежи по карте

Это даст вам любые продажи с сегодняшнего дня:

SELECT *
  FROM 
    categories,
    products,
    sales,
    reciepts,
  LEFT JOIN
    products ON reciepts.pID
    sales ON reciepts.oID
    categories ON products.cID
  WHERE DATE(s.ts) = CURDATE() 
    AND sales.card = 1

`

Итак, что у вас там, правильно.Вы упускаете что-то еще ...

Из того, что я вижу до сих пор, вы не выбрали таблицу продаж, которая могла бы стать вашей проблемой.
Вы пытались запустить код в SQL Management Studio ивидя, каков результат?

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