2016-01-11 154 views
0

嗨,我正在寻找一个查询来获取销售每个产品类别的每月SQL查询,按类别获取产品销量每个月

我有2个类别

Catid CatName 
1  Dispenser 
2  Refill 

我用这个下面查询来获取总销售额的所有产品类别

SELECT YEAR(OrderDate) as [Sales Year], 
MONTH(OrderDate) as [Sales Month], 
SUM(TotalAmount) AS [Total Sales] 
FROM Orders 
GROUP BY YEAR(OrderDate), MONTH(OrderDate) 
ORDER BY YEAR(OrderDate), MONTH(OrderDate) 

出把上面的查询

Sales Year Sales Month  Total Sales 
2015   6    1000.00 
2015   7    2000.00 

我怎样才能获得总销售额为每个产品类别

出认沽应该是这样的

Sales Year Sales Month  Dispenser-sales  Refill-sales   
    2015   6    500.00     500.00  
    2015   7    500.00     1500.00 

我的架构

Schema

回答

1

你必须join涉及的其它表(基于显示的模式)并使用条件聚合来获得按类别ID分割。

SELECT 
YEAR(o.OrderDate) as [Sales Year], 
MONTH(o.OrderDate) as [Sales Month], 
SUM(case when c.catid = 1 then o.TotalAmount else 0 end) AS [Dispenser Sales], 
SUM(case when c.catid = 2 then o.TotalAmount else 0 end) AS [Refill Sales] 
FROM Orders o 
join orderdetails od on o.order_id = od.orderid 
join store s on s.pro_id = od.pro_id 
join category c on c.catid = s.catid 
GROUP BY YEAR(o.OrderDate), MONTH(o.OrderDate) 
ORDER BY YEAR(o.OrderDate), MONTH(o.OrderDate) 
+0

感谢超快答案 – Ayman

1

您可能想要使用动态sql和PIVOT来做到这一点,因此您不必知道catid catname组合。

另外,你可能想求和ORDERDETAILS Quantity * UnitPrice以获得单个类别金额,而不是订单总金额。

DECLARE @SQL VARCHAR(MAX), 
     @Columns VARCHAR(MAX) 
SELECT @Columns = COALESCE(@Columns + ',', '') + QUOTENAME(CatName) 
FROM Category 

SET @Sql = ' 
    SELECT * FROM 
    (
     SELECT YEAR(o.OrderDate) [Sales Year], 
       MONTH(o.OrderDate) [Sales Month], 
       c.CatName, 
       od.Quantity * od.UnitPrice AS [CatAmount] 
     FROM Orders o 
       JOIN OrderDetails od ON o.Order_ID = od.Orderid 
       JOIN Store s ON od.Proid = s.Pro_ID 
       JOIN Category c ON s.CatID = c.Catid 
    ) T 
    PIVOT 
    (
     SUM([CatAmount]) 
     FOR CatName IN (' + @Columns + ') 
    ) p 
    ORDER BY [Sales Year], [Sales Month]' 

EXEC(@Sql) 

如果您只是想要特定的类别,您可以在不使用动态sql的情况下将名称硬编码到您的pivot语句中。

SELECT * FROM 
(
    SELECT YEAR(o.OrderDate) [Sales Year], 
      MONTH(o.OrderDate) [Sales Month], 
      c.CatName, 
      od.Quantity * od.UnitPrice AS [CatAmount] 
    FROM Orders o 
      JOIN OrderDetails od ON o.Order_ID = od.Orderid 
      JOIN Store s ON od.Proid = s.Pro_ID 
      JOIN Category c ON s.CatID = c.Catid 
) T 
PIVOT 
(
    SUM([CatAmount]) 
    FOR CatName IN ([Dispenser-sales],[Refill-sales]) 
) p 
ORDER BY [Sales Year], [Sales Month] 
+0

感谢我如何排序按日期 – Ayman

+0

我试图执行,但它给了以下错误消息1033,级别15,状态1,行15 ORDER BY子句是无效的在视图,内联函数,派生表,子查询和公用表表达式中,除非还指定了TOP,OFFSET或FOR XML。 – Ayman

+0

@Ayman您只需在枢轴部分后添加您的订单。 – JamieD77

相关问题