簡體   English   中英

如果我們需要在SQL Server 2014中聚合特定行時如何使用聚合函數

[英]How to use aggregate function if we need aggregate of specific rows in SQL Server 2014

我有下面的代碼,其中有7行。 我想在商品名稱欄中輸入平均,最小值,最大值,它們是相同的(例如:我有3個商品名稱相同的“鞋”,其成本分別為50、45、60。我有一個商品命名為“帽子”,成本為50。現在,我想取3個普通行的平均值,即50、45、60,並應顯示51.66。對於另一行,應顯示50,依此類推)

我的問題是,如果我在查詢下面運行,它將顯示同一行的平均值,最大值,最小值,而不是顯示相同行的平均值,最小值,最大值。

SELECT 
    PRODUCT.ProductName,
    Vendor.VendorName, VendorProduct.Cost,
    AVG(COST) AS AVG, 
    MIN(COST) AS MIN,
    MAX(COST) AS MAX
FROM
    PRODUCT
JOIN
    VendorProduct ON VendorProduct.ProductID = PRODUCT.ProductID
JOIN
    Vendor ON Vendor.VendorID = VendorProduct.VendorID
GROUP BY
    PRODUCT.ProductName, VendorProduct.Cost, Vendor.VendorName

任何幫助表示贊賞。

我猜您想要:

SELECT p.ProductName,
       AVG(vp.COST) AS AVG, MIN(vp.COST) AS MIN, MAX(vp.COST) AS MAX
FROM PRODUCT p join
     VendorProduct vp
     on vp.ProductID = p.ProductID
GROUP BY p.ProductName;

筆記:

  • 我已經使用表的縮寫限定了所有列名。
  • 我從SELECT刪除了供應商名稱,因為您需要按產品求平均值。
  • 由於相同的原因,我從GROUP BY刪除了供應商名稱和價格。
  • AVGMINMAX是列的錯誤名稱,因為它們是SQL關鍵字。

更改

AVG(cost) as avg

AVG(cost) OVER(PARTITION BY productname) as [avg]

對其他聚合進行相同的更改(添加OVER子句),並完全刪除GROUP BY行

這將為您提供與現在相同的行數,但是匯總將針對每個相同的產品名稱值重復進行。 您還可以保留供應商詳細信息

它是什么? 在sqls中,它稱為窗口函數; 一種對數據集進行分組並隱式將分組結果連接到明細行的方法,而不會丟失明細行的明細。 如果您的好奇心激起,MSDN將對他們說很多話

注意,戈登的建議重新命名列

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM