2016-10-14 2 views
0

Я пытаюсь реализовать поворотную таблицу в sql, но она не работает. То, что я в настоящее время выглядит следующим образом:Ошибка Sql с таблицей pivot

WITH Pivoted 
AS 
(
select vg.ParentProductCategoryName, c.CompanyName, sd.LineTotal 
FROM SalesLT.Product p join SalesLT.vGetAllCategories vg on p.ProductCategoryID = vg.ProductCategoryID 
Join SalesLT.SalesOrderDetail sd on p.ProductID = sd.ProductID 
JOIN SalesLT.SalesOrderHeader as soh ON sd.SalesOrderID = soh.SalesOrderID 
JOIN SalesLT.Customer AS c ON soh.CustomerID = c.CustomerID 
pivot(Sum([LineTotal]) for [ParentProductCategoryName] in (Accessories, Bikes, Clothing, Components)) AS sales 
) 
select * from Pivoted p; 
; 

Я получаю ошибку:

multi part "Column name" Identifier could not be bounded.

Если я удалил имена столбцов в выберите часть и использовать * вместо этого, я получаю:

The column 'ProductCategoryID' was specified multiple times for...

То, что я хочу, состоит в том, чтобы иметь представление об общем Доходе (в соответствии с суммой строкиTotal в таблице SalesOrderDetail) для каждого родительского продукта CategoryName (в vGetAllCategories), указанного (в виде столбцов) с re для каждого CompanyName (у Клиента). Как лучше добиться этого? Благодарю.

+0

изменения '' vg.ParentProductCategoryName' к vg.ParentProductCategoryName, как ParentProductCategoryName' так, что ваш стержень распознает столбец вы указываете, где у вас есть 'для [ParentProductCategoryName]', или аналогично ему. – scsimon

+0

Не проблема, никакой разницы. – mj1261829

ответ

0

Не знаете, зачем вам понадобится CTE для этого, но поместите свои JOINS в производную таблицу и вместо этого создайте эту производную таблицу.

SELECT * 
FROM (SELECT vg.ParentProductCategoryName, 
       c.CompanyName, 
       sd.LineTotal 
     FROM SalesLT.Product p 
       JOIN SalesLT.vGetAllCategories vg ON p.ProductCategoryID = vg.ProductCategoryID 
       JOIN SalesLT.SalesOrderDetail sd ON p.ProductID = sd.ProductID 
       JOIN SalesLT.SalesOrderHeader AS soh ON sd.SalesOrderID = soh.SalesOrderID 
       JOIN SalesLT.Customer AS c ON soh.CustomerID = c.CustomerID 
     ) t 
PIVOT( SUM([LineTotal]) 
     FOR [ParentProductCategoryName] IN (Accessories,Bikes,Clothing,Components)) AS sales 

или вы могли бы просто использовать агрегат SUM с ДЕЛУ

SELECT c.CompanyName, 
     Accessories = SUM(CASE WHEN vg.ParentProductCategoryName = 'Accessories' THEN sd.LineTotal END), 
     Bikes  = SUM(CASE WHEN vg.ParentProductCategoryName = 'Bikes' THEN sd.LineTotal END), 
     Clothing = SUM(CASE WHEN vg.ParentProductCategoryName = 'Clothing' THEN sd.LineTotal END), 
     Components = SUM(CASE WHEN vg.ParentProductCategoryName = 'Components' THEN sd.LineTotal END) 
FROM SalesLT.Product p 
     JOIN SalesLT.vGetAllCategories vg ON p.ProductCategoryID = vg.ProductCategoryID 
     JOIN SalesLT.SalesOrderDetail sd ON p.ProductID = sd.ProductID 
     JOIN SalesLT.SalesOrderHeader AS soh ON sd.SalesOrderID = soh.SalesOrderID 
     JOIN SalesLT.Customer AS c ON soh.CustomerID = c.CustomerID 
GROUP BY c.CompanyName 
Смежные вопросы