1. 程式人生 > 實用技巧 >利用 GROUP BY HAVING 解決複雜的問題

利用 GROUP BY HAVING 解決複雜的問題

問題一:找到平均交貨時間超過所有供應商的平均交貨時間的供應商(挑選低效率的供應商) 查詢交貨時間大於2015 季度平均水平的供應商
SELECT v.VendName,
       AVG(DATEDIFF(DAY, p.OrderDate, p.DeliveryDate)) DeliveryDays
FROM dbo.Vendors v
    JOIN dbo.PurchaseOrders p
        ON v.VendorID = p.VendorID
WHERE p.DeliveryDate IS NOT NULL
      AND p.OrderDate >= '2015-10-01 00:00:00'
      AND p.OrderDate < '2016-01-01 00:00:00'
GROUP BY v.VendName
HAVING AVG(DATEDIFF(DAY, p.OrderDate, p.DeliveryDate)) > ( SELECT AVG(DATEDIFF(DAY, OrderDate, DeliveryDate)) FROM dbo.PurchaseOrders WHERE DeliveryDate IS NOT NULL AND OrderDate >= '2015-10-01 00:00:00' AND OrderDate < '2016-01-01 00:00:00' );
問題二:列出在一定時間內的總銷售額大於某個類別下的所有產品的平均銷售額的產品(按類別查詢暢銷產品) 查詢2015年第4季度按類別查詢最暢銷的產品
SELECT
c.CategoryDescription, p.ProductName, SUM(od.QuotedPrice * od.QuantityOrdered) totalsales FROM dbo.Products p JOIN dbo.Order_Details od ON p.ProductNumber = od.ProductNumber JOIN dbo.Categories c ON p.CategoryID = c.CategoryID JOIN dbo.Orders o ON o.OrderNumber =
od.OrderNumber WHERE o.OrderDate BETWEEN '2015-10-01' AND '2015-12-31' GROUP BY p.CategoryID, c.CategoryDescription, p.ProductName HAVING SUM(od.QuotedPrice * od.QuantityOrdered) > ( SELECT AVG(sumcategory) FROM ( SELECT p2.CategoryID, p2.ProductNumber, SUM(od2.QuotedPrice * od2.QuantityOrdered) sumcategory FROM dbo.Products p2 JOIN dbo.Order_Details od2 ON p2.ProductNumber = od2.ProductNumber JOIN dbo.Orders o2 ON o2.OrderNumber = od2.OrderNumber WHERE p2.CategoryID = p.CategoryID --在外部查詢中過濾此類別 AND o2.OrderDate BETWEEN '2015-10-01' AND '2015-12-31' GROUP BY p2.CategoryID, p2.ProductNumber ) s GROUP BY s.CategoryID ) ORDER BY c.CategoryDescription, p.ProductName;