3

表 -产品的产品数量如下

╔═══════════╦═════════════╗
║ PRODUCTID ║ PRODUCTNAME ║
╠═══════════╬═════════════╣
║         1 ║ Nokia       ║
║         2 ║ Samsung     ║
║         3 ║ BlackBerry  ║
╚═══════════╩═════════════╝

表 - SalesPersonProduct有以下记录

╔═══════════════╦═══════════╗
║ SALESPERSONID ║ PRODUCTID ║
╠═══════════════╬═══════════╣
║ S1            ║         1 ║
║ S1            ║         2 ║
║ S1            ║         3 ║
║ S2            ║         1 ║
║ S3            ║         2 ║
╚═══════════════╩═══════════╝

编写一个返回已售产品总数的 SQL 查询?

4

2 回答 2

2

这应该很简单。您需要首先加入两个表。下面的查询使用LEFT JOIN,因为它包括左侧表上的所有记录,Products即使它在右侧表中有匹配的记录或没有SalesPersonProduct

加入记录后,您现在可以使用COUNT()聚合函数来计算每个组的记录数。

由于查询正在使用LEFT JOIN,所有在表上没有匹配记录的记录都将在列上SalesPersonProduct具有值。zeroTotalSold

SELECT  a.ProductID,
        a.ProductName,
        COUNT(b.ProductID) TotalSold
FROM    Products a
        LEFT JOIN SalesPersonProduct b
            ON a.ProductID = b.ProductID
GROUP   BY  a.ProductID,
            a.ProductName

输出

╔═══════════╦═════════════╦═══════════╗
║ PRODUCTID ║ PRODUCTNAME ║ TOTALSOLD ║
╠═══════════╬═════════════╬═══════════╣
║         1 ║ Nokia       ║         2 ║
║         2 ║ Samsung     ║         2 ║
║         3 ║ BlackBerry  ║         1 ║
╚═══════════╩═════════════╩═══════════╝

要进一步了解有关联接的更多信息,请访问以下链接:

于 2013-03-29T12:01:19.110 回答
1

如果您只想返回销售额的总数,那么您可以通过计算SalesPersonProduct表中的行数轻松做到这一点:

select count(productid) TotalProducts
from SalesPersonProduct;

但是如果您想要每个产品的总销售额,那么您将需要列JOIN上的表格productId

select p.productname, count(s.productid) TotalSales
from products p
left join SalesPersonProduct s
  on p.productid = s.productid
group by p.productname

请参阅SQL Fiddle with Demo

在该JOIN版本中,我关闭了一个LEFT JOIN将返回所有产品名称的 a,即使它没有销售。在您的示例数据中,如果您添加 Apple 作为产品名称,那么您将返回以下结果并使用 LEFT JOIN:

| PRODUCTNAME | TOTALSALES |
----------------------------
|       Apple |          0 |
|  BlackBerry |          1 |
|       Nokia |          2 |
|     Samsung |          2 |
于 2013-03-29T12:03:54.050 回答