Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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
Sql 当使用SUM作为检索到的表之一时,如何保留左外部联接表中的所有值,为什么GROUP BY似乎可以解决这个问题?_Sql - Fatal编程技术网

Sql 当使用SUM作为检索到的表之一时,如何保留左外部联接表中的所有值,为什么GROUP BY似乎可以解决这个问题?

Sql 当使用SUM作为检索到的表之一时,如何保留左外部联接表中的所有值,为什么GROUP BY似乎可以解决这个问题?,sql,Sql,我试图从两个非常小的客户表及其购买信息中提取信息。这两个表是带有id、姓名和电子邮件的“客户”。和带有id、客户id、项目、价格的“订单” 我想要的输出是客户姓名、电子邮件以及他们一生中购买的所有物品的总数 问题是,有些客户从未购买过任何东西或只购买过一次。因此,即使在使用leftouterjoin合并表并包含每个客户之后,我也只会获得关于进行了多次购买的客户的信息(当SUM函数可以工作时) 当我选择按customers.name分组时,这似乎得到了解决。我不知道为什么会这样,我想知道左外连接、

我试图从两个非常小的客户表及其购买信息中提取信息。这两个表是带有id、姓名和电子邮件的“客户”。和带有id、客户id、项目、价格的“订单”

我想要的输出是客户姓名、电子邮件以及他们一生中购买的所有物品的总数

问题是,有些客户从未购买过任何东西或只购买过一次。因此,即使在使用leftouterjoin合并表并包含每个客户之后,我也只会获得关于进行了多次购买的客户的信息(当SUM函数可以工作时)

当我选择按customers.name分组时,这似乎得到了解决。我不知道为什么会这样,我想知道左外连接、求和和和分组方式之间的交互是如何工作的。下面是整个信息表,以及我为获取信息所做的一切

GROUP BY似乎解决了这个问题,但我想知道它为什么会真正起作用

CREATE TABLE customers (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT,
    email TEXT);

INSERT INTO customers (name, email) VALUES ("Doctor Who", "doctorwho@timelords.com");
INSERT INTO customers (name, email) VALUES ("Harry Potter", "harry@potter.com");
INSERT INTO customers (name, email) VALUES ("Captain Awesome", "captain@awesome.com");

CREATE TABLE orders (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    customer_id INTEGER,
    item TEXT,
    price REAL);

INSERT INTO orders (customer_id, item, price)
    VALUES (1, "Sonic Screwdriver", 1000.00);
INSERT INTO orders (customer_id, item, price)
    VALUES (2, "High Quality Broomstick", 40.00);
INSERT INTO orders (customer_id, item, price)
    VALUES (1, "TARDIS", 1000000.00);

SELECT customers.name, customers.email, SUM(orders.price) AS total
FROM customers LEFT OUTER JOIN
     orders
     ON customers.id = orders.customer_id
GROUP BY customers.name 
ORDER BY total DESC;

假设您使用的是MySQL——而且是旧版本,因为新版本中的默认设置会导致语法错误

如果您尝试此查询

SELECT c.name, c.email, SUM(o.price) AS total
FROM customers c LEFT OUTER JOIN
     orders o
     ON c.id = o.customer_id
ORDER BY total DESC;
您有一个卑鄙的SQL查询。查询:

  • 是一个聚合查询(因为
    SUM()
  • 返回一行(因为没有分组依据)
  • 有两个延迟列,
    c.name
    c.email
大多数数据库(正确地)拒绝这样的查询。MySQL恰好允许它(在旧版本中)。
c.name
c.email
的值来自任意行。
SUM()
是所有数据的总和

正确的表达方式如下:

SELECT c.name, c.email, SUM(o.price) AS total
FROM customers c LEFT OUTER JOIN
     orders o
     ON c.id = o.customer_id
GROUP BY c.name, c.email
ORDER BY total DESC;
请注意,
分组依据
包含
选择
中的未聚合列。这将为每个客户名称/电子邮件生成一行

由于
customers.id
是主键,因此您也可以将其编写为:

SELECT c.name, c.email, SUM(o.price) AS total
FROM customers c LEFT OUTER JOIN
     orders o
     ON c.id = o.customer_id
GROUP BY c.id
ORDER BY total DESC;

您的
分组依据
语法不正确,因为
客户。电子邮件
不在
分组依据
客户中。名称
不是主键或唯一键。另外,标记您正在使用的数据库。