【问题标题】:Lookup with duplicate values使用重复值查找
【发布时间】:2021-04-10 07:30:49
【问题描述】:

这是一个复杂的问题。我有三张桌子:

产品表

ProductID ProductName
Product A Edwardian Desk
Product B Edwardian Lamp

还有一个 GROUPS 表

ProductGroup ProductID
Group A Product A
Group A Product B
Group B Product C

还有一个 SALES 表

Product ID Sales
Product A 1000
Product B 500

我需要显示每个产品组的总销售额。

这部分我明白;我写了查询:

SELECT Groups.ProductGroup, SUM(Sales) AS TotalSales
FROM Groups
JOIN Sales
ON Groups.ProductID=Sales.ProductID
GROUP BY Groups.ProductGroup

这是让我感到困惑的部分:对于每个组,我需要提取组中产品的名称之一。但是,提取哪个名称并不重要。所以最终的数据可以显示:

Group A, Edwardian Desk, 1500

或

Group A, Edwardian Lamp, 1500

如何将产品名称提取到我的查询中?

我在 Microsoft SQL Server 中工作

【问题讨论】:

  • 要获得没有任何特定逻辑的“其中之一”,您可以使用max 或min 聚合函数。它接受输入字符串

标签: sql join lookup


【解决方案1】:

有多种方法可以引入您的产品名称,有两种选择是使用 aggregation 和 correlated subquery 或使用 apply。

注意,我使用aliases 作为您的表名 - 这样做是一种很好的做法,可以使查询更紧凑且更易于阅读。另外 - 大概这是一个人为的例子,而不是你的实际表 - 但通常列名与表名相同不是一个好习惯,所以如果表 Sales 上的 Sales 代表一个数量,那么就叫它@ 987654327@!

select g.ProductGroup,
  (select Min(ProductName) from Products p where p.ProductId=g.ProductId) FirstProductAlphabetically,
  Sum(s.Sales) as TotalSales
from Groups g
join Sales s on s.ProductID=g.ProductID
group by g.ProductGroup


select g.ProductGroup, 
  p.ProductName as FirstProductById,
  Sum(s.Sales) as TotalSales
from Groups g
join Sales s on s.ProductID=g.ProductID
cross apply (
    select top (1) p.ProductName
    from Products p
    where p.ProductId=g.ProductId
    order by ProductId
)p
group by g.ProductGroup

【讨论】:

    【解决方案2】:

    您可以将products 添加到JOIN 并使用聚合函数:

    SELECT g.ProductGroup, SUM(s.Sales) AS TotalSales,
           MIN(p.ProductName)
    FROM Groups g JOIN
         Sales s
         ON g.ProductID = s.ProductID JOIN
         Products p
         ON p.ProductID = s.ProductId
    GROUP BY g.ProductGroup;
    

    注意:我经常添加两列 MIN() 和 MAX() 来获得两个样本名称。

    我应该补充。您的示例数据有ProductIds,它们在Products 中不是。这表明问题(更有可能)或数据模型存在问题。如果您确实引用了不存在的产品,请使用 LEFT JOIN 到 Products 而不是内部连接。

    【讨论】:

      猜你喜欢
      • 2019-12-06
      • 2010-12-04
      • 2021-09-06
      • 2013-05-30
      • 1970-01-01
      • 2018-09-26
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多