【问题标题】:Need help selecting proper columns for output in SQL需要帮助在 SQL 中选择正确的输出列
【发布时间】:2019-04-04 04:28:35
【问题描述】:
select  
    p.ProductID, max(hist.Cost) as 'MaxPrice'
from
    Product as p, ProductCostHistory as hist
where   
    p.ProductID = hist.ProductID
group by    
    p.ProductID

我所拥有的是一个 SQL 查询,旨在获取产品和它曾经的最高价格。但问题是我的第一列是产品的 ID (p.ProductID),我希望第一列是产品的名称 (p.name)。我不能简单地按产品名称分组,因为有些产品虽然名称相同,但 ID 不同。

据我所知,上面的查询给出了正确的输出,我将如何检索名称而不是 ID?

【问题讨论】:

标签: sql-server tsql


【解决方案1】:

你可以GROUP BYProductIDname的组合:

SELECT
    p.ProductID,
    p.name,
    MAX(hist.Cost) AS 'MaxPrice'
FROM Product AS p
INNER JOIN ProductCostHistory AS hist
    ON p.ProductID = hist.ProductID
GROUP BY
    p.ProductID,
    p.name;

这种组合应该仍然是唯一的,因为给定的ProductID 理想情况下应该只映射到一个名称。

如果您真的只想显示name 和最高价格,那么您可以对上述答案进行子查询并仅选择nameMaxPrice。但是,这可能会导致给定名称的多个记录,然后您将无法将一个与另一个分开。

旁注:如果可能,请尝试使用显式连接语法,除非有其他令人信服的理由。

【讨论】:

    【解决方案2】:

    您可以对同一张表使用子查询和 INNER JOIN 来满足您的要求-

    select p.name,temp_prod.ProductID,temp_prod.cost as highes_cost from Product 
    INNER JOIN (
           select  
              p.ProductID, max(hist.Cost) as cost as 'MaxPrice'
           from
              Product as p, ProductCostHistory as hist
           where   
              p.ProductID = hist.ProductID
           group by    
              p.ProductID
              )temp_prod ON
    ( temp_prod.ProductID = Product.ProductID )
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      SELECT p.ProductId, 
          p.Name, 
          (SELECT MAX(cost) FROM ProductCostHistory as hist where p.ProductID = hist.ProductID)
      FROM Product as p
      

      SELECT p.ProductId, t2.cost, p.Name
      FROM Product as p
      INNER JOIN (
          SELECT productId, MAX(cost) FROM ProductCostHistory 
            group by ProductId) t2
          ON p.ProductId = t2.Productid
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多