[英]Count total orders and total products for each customer
我有 3 个表:
我需要 select 每个客户的总订单数和他们订购的产品总数。
要计算每个客户的总订单数,查询是:
SELECT c.CustomerID, COUNT(o.OrderID) AS TotalOrders
FROM customers AS c
INNER JOIN orders AS o ON c.CustomerID = o.CustomerID
GROUP BY o.CustomerID
ORDER BY TotalOrders DESC
但是如何统计每个客户订购的产品总数呢?
我想要类似下面的东西:
客户ID | 总订单 | 总产品 |
---|---|---|
1个 | 5个 | 12 |
2个 | 3个 | 8个 |
使用示例数据更新了问题:
我已经用我的三个表的样本数据更新了我的问题。 部分申通用户在此建议查询的output也如下。
顾客:
行号 | 客户ID |
---|---|
1个 | 1个 |
2个 | 2个 |
订单:
行号 | 订单号 | 客户ID |
---|---|---|
1个 | 101 | 1个 |
2个 | 102 | 1个 |
3个 | 103 | 2个 |
4个 | 104 | 1个 |
订单产品:
行号 | 订单号 | 产品编号 |
---|---|---|
1个 | 101 | 1个 |
2个 | 101 | 2个 |
3个 | 102 | 1个 |
4个 | 103 | 1个 |
5个 | 104 | 1个 |
询问:
SELECT c.CustomerID, COUNT(o.OrderID) AS TotalOrders, COUNT(op.ProductID) AS TotalProducts
FROM customers AS c INNER JOIN orders AS o
ON c.CustomerID = o.CustomerID
INNER JOIN orders_products AS op
ON o.OrderID = op.OrderID
GROUP BY c.CustomerID
ORDER BY TotalOrders DESC, TotalProducts DESC
Output(不正确):
客户ID | 总订单 | 总产品 |
---|---|---|
1个 | 4个 | 4个 |
2个 | 1个 | 1个 |
可以看到ID为1的客户下了3个订单,在这些订单下购买了5个产品。 但是查询为他提供了 4 个总订单和 4 个总产品。 错了!
预计 Output(正确):
客户ID | 总订单 | 总产品 |
---|---|---|
1个 | 3个 | 4个 |
2个 | 1个 | 1个 |
首先ProductID是一个主键,应该是唯一的。
其次,我尝试使用不同类型的 JOIN:INNER JOIN: Returns records that have matching values in both tables
LEFT JOIN:返回左表中的所有记录,以及右表中匹配的记录
RIGHT JOIN:返回右表中的所有记录,以及左表中匹配的记录
CROSS JOIN:返回两个表中的所有记录
但是表之间的关系没有任何错误。
在我的例子中,我更改了订单表,它包含 ProductID 和 CustomerID,它给出了正确的结果,希望对您有所帮助
-- create
CREATE TABLE customer (
customerId INTEGER PRIMARY KEY
);
CREATE TABLE orders (
ordersId INTEGER PRIMARY KEY,
customerId INTEGER,
productsId INTEGER,
CONSTRAINT FK_CustomerOrder FOREIGN KEY (customerId)
REFERENCES customer(customerId),
CONSTRAINT FK_PersonProducts FOREIGN KEY (productsId)
REFERENCES products(productsId)
);
CREATE TABLE products (
productsId INTEGER PRIMARY KEY
);
-- insert
INSERT INTO customer VALUES (1);
INSERT INTO customer VALUES (2);
INSERT INTO orders VALUES (101, 1, 10001);
INSERT INTO orders VALUES (102, 1, 10001);
INSERT INTO orders VALUES (103, 2, 10005);
INSERT INTO orders VALUES (104, 1, 10003);
INSERT INTO products VALUES (10001);
INSERT INTO products VALUES (10002);
INSERT INTO products VALUES (10003);
INSERT INTO products VALUES (10004);
INSERT INTO products VALUES (10005);
-- fetch
SELECT c.customerId,
COUNT(o.ordersId) AS TotalOrders,
COUNT(op.productsId) AS TotalProducts
FROM customer AS c
INNER JOIN orders AS o ON c.customerId = o.customerId
INNER JOIN products AS op ON o.productsId = op.productsId
GROUP BY c.customerId
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.