因此,假设我的结果集中总共需要5列,例如:
Name, Date, Color, Price, TotalSales
名称,日期,颜色和价格都存储在一个表中,因此我将从该表中获取每一行。
SELECT * FROM AwesomeStuff
但是,TotalSales需要根据另一个表中的值的SUM计算,并且需要组合的值必须与AwesomeStuff表中的行ID相匹配。
SELECT SUM(SalePrice) FROM AwesomeSales
AwesomeSales表中的每一行都有一个与AwesomeStuff表中的单个项匹配的ID。所以我想将所有SalePrice值添加到一个列中,并将其与AwesomeStuff查询中的正确行匹配,以便我返回单个结果集。
这是如何工作的?除了查询之外,你能解释一下SQL用简单的英语做什么,这样我才能理解将来如何再次编写这种类型的SELECT?
感谢。
答案 0 :(得分:5)
您可以执行GROUP BY
操作,按“AwesomeStuff”项目对结果进行分组:
SELECT
A.Name,
A.Date,
A.Color,
A.Price,
SUM(S.SalePrice) AS TotalSales
FROM
AwesomeStuff A
INNER JOIN
AwesomeSales S
ON
S.AwesomeStuffId = A.Id
GROUP BY
A.Name,
A.Date,
A.Color,
A.Price
答案 1 :(得分:4)
select
t.name,
t.date,
t.color,
t.price,
a.TotalSales
from awesomestuff t
inner join
(
select id, sum(saleprice) as TotalSales
from awesomesales
group by id
)a
on t.id = a.id
这样做是根据每个SUM()
计算id
。然后使用内部联接,它会在结果集中显示TotalSales
每id
的关系。
答案 2 :(得分:2)
执行所需操作的SQL是:
select AwesomeStuff.Name,
AwesomeStuff.Date,
AwesomeStuff.Color,
AwesomeStuff.Price,
AwesomeStuff.TotalSales,
TotalSales.Price
from AwesomeStuff
join (select AwesomeSales.id,
sum(AwesomeSales.SalePrice) As Price
from AwesomeSales
group by id) As TotalSales
on TotalSales.id = AwesomeStuff.id;
我会在午餐后用英文解释更新这篇文章。
英语您汇总销售价格,并按其ID分组。这就是内联视图(子查询)的作用:我们包含ID,因为我们需要在连接中使用它。也就是说,我们将您的AwesomeStuff
表加入销售的内联视图(别名为TotalSales
,稍后我们将其引用),按ID匹配 - 因为这是主键 - 然后选择所有字段(包括计算的总和,我们将其别名为Price
)。
答案 3 :(得分:1)
如果您的数据库支持子查询,则可以使用子查询:
SELECT stuff.Name, stuff.Date, stuff.Color, stuff.Price, sales.total
FROM AwesomeStuff AS stuff,
(SELECT STUFF_ID, SUM(SalePrice) AS total
FROM AwesomeSales
GROUP BY STUFF_ID) AS sales
where stuff.ID = sales.STUFF_ID
答案 4 :(得分:0)
SELECT
a.Name,
a.Date,
a.Color,
a.Price,
SUM(s.SalesPrice)
FROM AwesomeStuff as a
INNER JOIN AwesomeSales as s on a.ID = s.AwesomestuffID
GROUP BY a.Name, a.Date, a.Color, a.Price
用简单的英语,你所做的就是说给你我的东西表中所有名称,日期,颜色和价格的独特组合,以及销售表中所有销售额的总和。这假设填充表中的每个ID代表名称,日期,颜色和价格的唯一组合。
答案 5 :(得分:0)
尝试:
SELECT A.Id, -- not required in select for query to work - included for clarity
max(A.Name),
max(A.Date),
max(A.Color),
max(A.Price),
SUM(S.SalePrice) AS TotalSales
FROM AwesomeStuff A
LEFT JOIN AwesomeSales S ON S.AwesomeStuffId = A.Id
GROUP BY A.Id
通过将AwesomeStuff加入AwesomeSales产品的唯一ID,每次销售产品时都会返回一行 - 因为每个产品只需要一行,您需要按产品的唯一ID进行分组。 (SUM函数应该是不言自明的。)
不幸的是,大多数形式的SQL都不允许您在分组查询中包含未聚合的值,即使这些值在功能上依赖于正在分组的值之一 - 就像在此查询中一样。这就是名称,日期,颜色和价格都已达到MAX的原因。
左连接确保即使连接的右侧没有相应的记录(AwesomeSales),也会返回连接左侧的记录(此处为AwesomeStuff)。换句话说,此版本的查询将包含没有销售的产品。