2016-10-14 6 views
0

SQLでピボットテーブルを実装しようとしていますが、機能していません。私は現在持っていることは以下の通りです:Sqlテーブルのピボットエラー

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...

私が欲しいのは、reTable(列としてピボット表示されている)の各ParentProductCategoryName(vGetAllCategories内)ごとに、総収入(SalesOrderDetailテーブルのlineTotalの合計で指定)を表示することです。各CompanyName(顧客)のスペクトラムこれをより良くするには?ありがとう。

+0

変更' vg.ParentProductCategoryName'でSUM集合を使用することができます'for [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 

たり、ピボットは、あなたが持っている、あなたが指定している列を認識するようにあなただけのParentProductCategoryName`として `vg.ParentProductCategoryNameにCASE

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