Sql 当使用SUM作为检索到的表之一时,如何保留左外部联接表中的所有值,为什么GROUP BY似乎可以解决这个问题?
我试图从两个非常小的客户表及其购买信息中提取信息。这两个表是带有id、姓名和电子邮件的“客户”。和带有id、客户id、项目、价格的“订单” 我想要的输出是客户姓名、电子邮件以及他们一生中购买的所有物品的总数 问题是,有些客户从未购买过任何东西或只购买过一次。因此,即使在使用leftouterjoin合并表并包含每个客户之后,我也只会获得关于进行了多次购买的客户的信息(当SUM函数可以工作时) 当我选择按customers.name分组时,这似乎得到了解决。我不知道为什么会这样,我想知道左外连接、求和和和分组方式之间的交互是如何工作的。下面是整个信息表,以及我为获取信息所做的一切 GROUP BY似乎解决了这个问题,但我想知道它为什么会真正起作用Sql 当使用SUM作为检索到的表之一时,如何保留左外部联接表中的所有值,为什么GROUP BY似乎可以解决这个问题?,sql,Sql,我试图从两个非常小的客户表及其购买信息中提取信息。这两个表是带有id、姓名和电子邮件的“客户”。和带有id、客户id、项目、价格的“订单” 我想要的输出是客户姓名、电子邮件以及他们一生中购买的所有物品的总数 问题是,有些客户从未购买过任何东西或只购买过一次。因此,即使在使用leftouterjoin合并表并包含每个客户之后,我也只会获得关于进行了多次购买的客户的信息(当SUM函数可以工作时) 当我选择按customers.name分组时,这似乎得到了解决。我不知道为什么会这样,我想知道左外连接、
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
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;
您的
分组依据
语法不正确,因为客户。电子邮件
不在分组依据
和客户中。名称
不是主键或唯一键。另外,标记您正在使用的数据库。