繁体   English   中英

如何从单个表中选择一个数据结果集,其中一个列来自另一个表中列的SUM?

[英]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创建每个idTotalSales的关系以显示在结果集中。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM