选择列表中的列无效,未在聚合函数

时间:2016-05-26 15:26:21

标签: sql sql-server sql-server-2012

我想显示这样的列:

ProductID | Price | PricingPlanLicense | PricingPlanQuality
----------+-------+--------------------+-------------------    
1            16.99         Buy                 HD
1            12.99         Buy                 SD
1             2.99         Rent                HD
3             4.99         Rent                HD

问题是,在我的数据中,我有多个PricingPlanLicensePricingPlanQuality组合,我想选择价格最高的那个。

到目前为止,我有这个问题:

SELECT 
    ProductID, MAX(Price), PricingPlanLicense, PricingPlanQuality
FROM 
    [#ExportPricingTable] 
GROUP BY 
    PricingPlanLicense, PricingPlanQuality

但这不起作用,因为ProductID未聚合,我如何告诉SQL Server使用已存在的ProductID

由于

4 个答案:

答案 0 :(得分:1)

这样做的规范方法是使用联接来获取与每个具有最高价格的组相对应的ProductID

SELECT t1.ProductID, t1.Price, t1.PricingPlanLicense, t1.PricingPlanQuality
FROM [#ExportPricingTable] t1
INNER JOIN
(
    SELECT MAX(Price) AS maxPrice, PricingPlanLicense, PricingPlanQuality
    FROM [#ExportPricingTable] 
    GROUP BY PricingPlanLicense, PricingPlanQuality
) t2
    ON t1.Price = t2.maxPrice AND t1.PricingPlanLicense = t2.PricingPlanLicense AND
       t1.PricingPlanQuality = t2.PricingPlanQuality

以下是您可以尝试的演示:

SQLFiddle

答案 1 :(得分:1)

ProductID添加到Group By子句。

SELECT ProductID, MAX(Price), PricingPlanLicense, PricingPlanQuality
FROM [#ExportPricingTable] 
GROUP BY ProductID, PricingPlanLicense, PricingPlanQuality

答案 2 :(得分:0)

您可以使用MAXSELECT MIN(ProductID), MAX(Price), PricingPlanLicense, PricingPlanQuality FROM [#ExportPricingTable] GROUP BY PricingPlanLicense, PricingPlanQuality 选择一个ID,例如:

ProductID

这将为每个PricingPlanLicense, PricingPlanQuality值组选择最小async()值。

答案 3 :(得分:0)

如果要为聚合选择多于列的列,可以使用row_number()对数据进行排序,然后选择第一行:

SELECT * FROM (
  SELECT ProductID, Price, PricingPlanLicense, PricingPlanQuality
         ROW_NUMBER() OVER (partition by PricingPlanLicense, PricingPlanQuality ORDER BY Price desc) RN
  FROM [#ExportPricingTable] 
)
WHERE RN = 1
相关问题