代码之家  ›  专栏  ›  技术社区  ›  FailedUnitTest

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

  •  0
  • FailedUnitTest  · 技术社区  · 10 年前

    我想这样显示列:

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

    问题是,在我的数据中,我有多个 PricingPlanLicense PricingPlanQuality 我想买一个价格最高的。

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

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

    但这不起作用,因为 ProductID 未聚合,如何告诉SQL Server使用 产品ID 已经有了吗?

    谢谢

    4 回复  |  直到 10 年前
        1
  •  1
  •   Michael Z.    10 年前

    添加 ProductID Group By 条款

    SELECT ProductID, MAX(Price), PricingPlanLicense, PricingPlanQuality
    FROM [#ExportPricingTable] 
    GROUP BY ProductID, PricingPlanLicense, PricingPlanQuality
    
        2
  •  1
  •   Tim Biegeleisen    10 年前

    使用联接获取 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

        3
  •  0
  •   Giorgos Betsos    10 年前

    您可以选择一个ID,使用 MIN MAX ,例如:

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

    这将选择最小值 ProductID 值的间隔 PricingPlanLicense, PricingPlanQuality 一组值。

        4
  •  0
  •   msheikh25    10 年前

    如果要为聚合选择多于组的列,可以使用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