2014-12-19 75 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