2014-12-19 8 views
0

Кто-нибудь знает, как я могу повернуть этот запрос так, чтобы имя производителя было столбцами, а строки - месяцами, которые вычисляются в подзапросах.SQL Server Pivot Trouble

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

Привет, это действительно goo! Единственное, что есть ISNULL для количества * цена не работает - он все равно возвращает NULL. Это не конец света, если он не может быть достигнут, но это было бы хорошо. – Adam92