Ошибка Sql при своде таблиц

#sql-server #tsql #pivot #pivot-table

#sql-сервер #tsql #сводная #сводная таблица

Вопрос:

Я пытаюсь реализовать сводную таблицу в 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;
;
 

Я получаю сообщение об ошибке:

не удалось ограничить многосоставный идентификатор «Имя столбца».

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

Столбец ‘ProductCategoryID’ был указан несколько раз для…

Я хочу иметь представление об общем доходе (как указано в сумме lineTotal в таблице SalesOrderDetail) для каждого родительского продукта (в vGetAllCategories), указанного (в виде столбцов) в отношении каждого CompanyName (в Customer). Как лучше этого добиться? Спасибо.

Комментарии:

1. измените vg.ParentProductCategoryName на vg.ParentProductCategoryName as ParentProductCategoryName , чтобы ваша сводная таблица распознала столбец, который вы указываете, где у вас есть for [ParentProductCategoryName] , или присвоила ему соответствующий псевдоним.

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

Ответ №1:

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

 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
 

или вы могли бы просто использовать совокупную сумму с РЕГИСТРОМ

 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