![](/img/trans.png)
[英]SQL Can I have one result table from two queries so they align data in different columns
[英]How can I SELECT a result set of data from a single table with one of the columns coming from the SUM of a column in a different table?
因此,假设我想在结果集中总共添加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?
谢谢。
您可以执行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
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
这样做是根据每个id
计算SUM()
。 然后使用内部TotalSales
创建每个id
的TotalSales
的关系以显示在结果集中。
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,因为我们需要在连接中使用它。 那就是我们加入你的AwesomeStuff
表和销售的内联视图(别名为TotalSales
,我们稍后会引用它),按ID匹配它们 - 因为这是主键 - 然后选择所有字段(包括计算的)总和,我们一起作为Price
别名。
如果数据库支持子查询,则可以使用子查询:
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
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代表名称,日期,颜色和价格的唯一组合。
尝试:
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)。 换句话说,此版本的查询将包含没有销售的产品。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.