Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何对联接表中的值进行求和,而不使第一个表中的值总和出错?_Mysql_Sql_Inner Join - Fatal编程技术网

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(*)相同。可以但他的副手名单上的分组毫无意义。一个人必须选择一个值。谢谢-我确实盯着它看了很长一段时间,想知道它是关于什么的-猜现在我知道了;)