#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