我在大约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并链接到sales表ID,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,end就可以做到这一点,但显然不行。
有人能帮我解决这个SQL问题吗?我如何将卡条件放入嵌入式SQL中,因为它是从收据中检索的,并且收据没有保存关于它是否是信用卡支付的信息?
我真的不知道该怎么做。我们将非常感谢您的帮助!
发布于 2019-09-19 21:44:58
它的基本形式是:
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`
所以你在那里得到的是正确的。你还遗漏了一些东西。
在我看来,到目前为止,您还没有选择sales表,这可能是您的问题。
您是否尝试过在SQL management studio中运行代码并查看结果?
https://stackoverflow.com/questions/58011858
复制相似问题