[英]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
刪除了供應商名稱和價格。 AVG
, MIN
和MAX
是列的錯誤名稱,因為它們是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.