gpt4 book ai didi

mysql - 如何在不搞砸第一个表中的总值的情况下对连接表中的值求和?

转载 作者:行者123 更新时间:2023-11-29 06:33:29 25 4
gpt4 key购买 nike

我想SELECT 客户数量、客户订单总和以及特定州的客户数量。

我知道如何在两个查询中轻松执行此操作,但是将使用相同的 WHERE 约束,因此似乎最好在一个查询中执行此操作并避免重复。我很想改进我的 SQL,但我不知道如何组合它们。将它们作为两个单独的查询感觉非常笨拙。

有没有办法把它们结合起来?我应该考虑哪些因素来确定将它们结合起来是否是一个好主意?


客户

*-------------*-------------*--------------*------------*
| ID_Customer | ID_State | Name | ...etc... |
*-------------*-------------*--------------*------------*

状态

*-------------*-------------*
| ID_State | Name |
*-------------*-------------*

订单

*----------*-------------*--------------*------------*
| ID_Order | ID_Customer | ...etc... | Total |
*----------*-------------*--------------*------------*

查询 1.1 - 选择 Count of Customers 和 Count of Customers in specific states

SELECT 
COUNT(*) AS Customers,
SUM(States.Name = 'California') AS California_Customers,
SUM(States.Name = 'New York') AS NewYork_Customers

FROM Customers
INNER JOIN States ON Customers.ID_State = States.ID_State

查询 1.2 - 选择客户订单总和

SELECT 
SUM(Total) AS SumOfOrderTotals

FROM Orders
INNER JOIN Customers ON Customers.ID_Customer = Orders.ID_Customer

查询 2 - 尝试将查询合并为一个(无效)

SELECT 
COUNT (DISTINCT(Customers.ID_Customer)) AS Customers,
SUM (Orders.Total) AS SumOfOrderTotals,
SUM (States.Name = 'California') AS California_Customers,
SUM (States.Name = 'New York') AS NewYork_Customers

FROM
Customers
INNER JOIN Orders ON Customers.ID_Customer = Orders.ID_Customer
INNER JOIN States ON Customers.ID_State = States.ID_State

显然这不起作用,因为 CustomersOrders 之间的 INNER JOIN 意味着 States.Name 为每个客户计算了 xN(其中 N 是客户的订单数量),因此这些总数是错误的。


我考虑过子查询,但我不确定在这种情况下如何应用子查询(如果那是我应该做的)。

最佳答案

您需要在join 之前进行聚合或使用子查询:

SELECT COUNT(DISTINCT(c.ID_Customer)) AS Customers, 
o.SumOfOrderTotals,
SUM(s.Name = 'California') AS California_Customers,
SUM(s.Name = 'New York') AS NewYork_Customers
FROM Customers c JOIN
States s
ON c.ID_State = s.ID_State CROSS JOIN
(SELECT SUM(Total) as SumOfOrderTotals
FROM Orders o
) o;

你也可以这样写:

SELECT COUNT(DISTINCT(c.ID_Customer)) AS Customers, 
(SELECT SUM(Total)
FROM Orders o
) as SumOfOrderTotals,
SUM(s.Name = 'California') AS California_Customers,
SUM(s.Name = 'New York') AS NewYork_Customers
FROM Customers c JOIN
States s
ON c.ID_State = s.ID_State;

关于mysql - 如何在不搞砸第一个表中的总值的情况下对连接表中的值求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26508578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com