2014-12-19 79 views
0

有谁知道我可以如何枢轴转动这个查询,以便Manufacturer.name是列,行是月份,它们是在子查询中计算的。SQL Server枢轴问题

SELECT Manufacturer.manufacturer_id 
     ,Manufacturer.name 
     ,(SELECT ISNULL(SUM(SalesOrderLineItem.price*SalesOrderLineItem.quantity), 0) 
     FROM SalesOrderLineItem 
     INNER JOIN Products 
      ON SalesOrderLineItem.product_id = Products.product_id 
     INNER JOIN SalesOrder 
      ON SalesOrderLineItem.order_id = SalesOrder.sales_order_id 
     INNER JOIN Client 
      ON SalesOrder.client_id = Client.client_id 
     WHERE products.manufacturer_id = Manufacturer.manufacturer_id 
      AND Client.client_id = '224' 
      AND SalesOrder.order_placed BETWEEN '2014-09-01 00:00:00' AND '2014-09-30 23:59:00') AS 'sep-14' 
     ,(SELECT ISNULL(SUM(SalesOrderLineItem.price*SalesOrderLineItem.quantity), 0) 
     FROM SalesOrderLineItem 
     INNER JOIN Products 
      ON SalesOrderLineItem.product_id = Products.product_id 
     INNER JOIN SalesOrder 
      ON SalesOrderLineItem.order_id = SalesOrder.sales_order_id 
     INNER JOIN Client 
      ON SalesOrder.client_id = Client.client_id 
     WHERE products.manufacturer_id = Manufacturer.manufacturer_id 
      AND Client.client_id = '224' 
      AND SalesOrder.order_placed BETWEEN '2014-10-01 00:00:00' AND '2014-10-31 23:59:00') AS 'oct-14' 
     ,(SELECT ISNULL(SUM(SalesOrderLineItem.price*SalesOrderLineItem.quantity), 0) 
     FROM SalesOrderLineItem 
     INNER JOIN Products 
      ON SalesOrderLineItem.product_id = Products.product_id 
     INNER JOIN SalesOrder 
      ON SalesOrderLineItem.order_id = SalesOrder.sales_order_id 
     INNER JOIN Client ON SalesOrder.client_id = Client.client_id 
     WHERE products.manufacturer_id = Manufacturer.manufacturer_id 
      AND Client.client_id = '224' 
      AND SalesOrder.order_placed BETWEEN '2014-11-01 00:00:00' AND '2014-11-30 23:59:00') AS 'nov-14' 
     ,(SELECT ISNULL(SUM(SalesOrderLineItem.price*SalesOrderLineItem.quantity), 0) 
     FROM SalesOrderLineItem 
     INNER JOIN Products 
      ON SalesOrderLineItem.product_id = Products.product_id 
     INNER JOIN SalesOrder 
      ON SalesOrderLineItem.order_id = SalesOrder.sales_order_id 
     INNER JOIN Client 
      ON SalesOrder.client_id = Client.client_id 
     WHERE products.manufacturer_id = Manufacturer.manufacturer_id 
      AND Client.client_id = '224' 
      AND SalesOrder.order_placed BETWEEN '2014-12-01 00:00:00' AND '2014-12-31 23:59:00') AS 'dec-14' 
FROM Manufacturer 

非常感谢。

回答

1

试试看:

WITH DATA 
AS 
(
    SELECT Manufacturer.name AS ManufacturerName 
      ,MONTH(SalesOrder.order_placed) AS MonthNumber 
      ,ISNULL(SUM(SalesOrderLineItem.price*SalesOrderLineItem.quantity), 0) AS Total 
    FROM SalesOrderLineItem 
    INNER JOIN Products 
     ON SalesOrderLineItem.product_id = Products.product_id 
    INNER JOIN SalesOrder 
     ON SalesOrderLineItem.order_id = SalesOrder.sales_order_id 
    INNER JOIN Client 
     ON SalesOrder.client_id = Client.client_id 
    INNER JOIN Manufacturer 
     ON products.manufacturer_id = Manufacturer.manufacturer_id 
     AND Client.client_id = '224' 
     AND SalesOrder.order_placed BETWEEN '2014-09-01 00:00:00' AND '2014-12-31 23:59:00' 
) 
SELECT MonthNumber, [ManufacturerName1], [ManufacturerName2] 
FROM DATA 
PIVOT (MAX(Total) FOR ManufacturerName IN ([ManufacturerName1], [ManufacturerName2])) AS P; 

不幸的是,你必须硬编码的制造商名称的查询,或者使用动态SQL未知制造商。

+0

嗨,这真是咕!唯一的问题是数量*价格的ISNULL不起作用 - 它仍然返回NULL。它不是世界的尽头,如果它不能实现,但它会很好。 – Adam92 2014-12-19 11:20:47