繁体   English   中英

计算每个客户的订单总数和产品总数

[英]Count total orders and total products for each customer

我有 3 个表:

  • 客户(客户 ID)
  • 订单(OrderID,CustomerID)
  • 订单产品(订单 ID、产品 ID)

我需要 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM