Mysql 如何对联接表中的值进行求和,而不使第一个表中的值总和出错?
我想Mysql 如何对联接表中的值进行求和,而不使第一个表中的值总和出错?,mysql,sql,inner-join,Mysql,Sql,Inner Join,我想选择客户数量计数、客户订单总数和特定状态下的客户计数 我知道如何在两个查询中轻松实现这一点,但是将使用相同的约束,因此似乎最好在一个查询中实现,并避免重复。我渴望改进我的SQL,但我无法解决如何将它们结合起来。将它们作为两个独立的查询感觉非常笨拙 有没有办法把它们结合起来?我认为应该考虑哪些因素来组合它们是个好主意? 客户表格 *-------------*-------------*--------------*------------* | ID_Customer | ID_State
选择
客户数量计数、客户订单总数和特定状态下的客户计数
我知道如何在两个查询中轻松实现这一点,但是将使用相同的约束,因此似乎最好在一个查询中实现,并避免重复。我渴望改进我的SQL,但我无法解决如何将它们结合起来。将它们作为两个独立的查询感觉非常笨拙
有没有办法把它们结合起来?我认为应该考虑哪些因素来组合它们是个好主意?
客户
表格
*-------------*-------------*--------------*------------*
| ID_Customer | ID_State | Name | ...etc... |
*-------------*-------------*--------------*------------*
*-------------*-------------*
| ID_State | Name |
*-------------*-------------*
*----------*-------------*--------------*------------*
| ID_Order | ID_Customer | ...etc... | Total |
*----------*-------------*--------------*------------*
状态
表
*-------------*-------------*--------------*------------*
| ID_Customer | ID_State | Name | ...etc... |
*-------------*-------------*--------------*------------*
*-------------*-------------*
| ID_State | Name |
*-------------*-------------*
*----------*-------------*--------------*------------*
| ID_Order | ID_Customer | ...etc... | Total |
*----------*-------------*--------------*------------*
订单
表格
*-------------*-------------*--------------*------------*
| ID_Customer | ID_State | Name | ...etc... |
*-------------*-------------*--------------*------------*
*-------------*-------------*
| ID_State | Name |
*-------------*-------------*
*----------*-------------*--------------*------------*
| ID_Order | ID_Customer | ...etc... | Total |
*----------*-------------*--------------*------------*
查询1.1-选择客户数量和特定状态下的客户数量
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
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
查询2-尝试将查询合并为一个查询(无效)
SELECT
SUM(Total) AS SumOfOrderTotals
FROM Orders
INNER JOIN Customers ON Customers.ID_Customer = Orders.ID_Customer
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
显然,这不起作用,因为客户
和订单
之间的内部联接
意味着状态。每个客户的名称
s被计算为xN(其中N是客户拥有的订单数),使得这些总数错误
我考虑过一个子查询,但是我不确定在这种情况下如何应用它(如果我应该这样做的话) 您需要在加入或使用子查询之前进行聚合:
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;
将子查询放置在本应放置任何附加字段的位置,作为SELECT子句中的另一项内容
SELECT
COUNT(*) AS Customers,
SUM(States.Name = 'California') AS California_Customers,
SUM(States.Name = 'New York') AS NewYork_Customers,
(SELECT SUM(Total) FROM Orders) AS SumOfOrderTotals
FROM Customers
INNER JOIN States ON Customers.ID_State = States.ID_State;
非常感谢。后者与我的想法一致,但我不确定如何以及在何处放入子查询;您现在无法在第二个查询上运行此命令。如果我删除子查询,它可以正常工作。是否绝对允许在SELECT
语句中使用子查询?@Eilidh。哎呀,我在里面留下了一个群组(我原以为你想要客户的总数)。不!我想知道为什么会出现这样的情况,我对它的出现感到有点困惑:)谢谢,这非常好(显然,WHERE
子句实际上被添加了两次,在SUM
和外部查询的子查询中)-干杯!我尝试了这个(在另一个答案中是后一个版本),但是我收到了错误“#2014命令不同步,你现在不能运行这个命令”-如果我删除子查询,它可以正常工作。好吧,让我们看看。Gordon统计不同的客户ID,这与Count(*)相同。可以但他的副手名单上的分组毫无意义。一个人必须选择一个值。谢谢-我确实盯着它看了很长一段时间,想知道它是关于什么的-猜现在我知道了;)