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

时间:2011-12-29 14:57:40

标签: sql

因此,假设我的结果集中总共需要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?

感谢。

6 个答案:

答案 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。然后使用内部联接,它会在结果集中显示TotalSalesid的关系。

答案 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)。换句话说,此版本的查询将包含没有销售的产品。