2015-04-03 5 views
0

Я создал Static Pivot просто отлично, но когда я делал динамическую версию, я продолжал получать ошибки, такие как неправильный синтаксис в разделе HAVING и другие ошибки, такие как неверный идентификатор.Неисправность в SQL Server Dynamic Pivot

Select Color,Gender,Size,PreBuyQty,[5277],[5294],[5365]FROM 
(SELECT pb.Color, o.OrderID, pb.Gender, pb.SizeNo, pb.Size, pb.PreBuyQty, od.Quantity 
FROM   Orders AS o INNER JOIN 
         OrderDetails AS od ON o.OrderID = od.OrderID INNER JOIN 
         ProductsPreBuy AS pb ON od.ProductCode = pb.productcode 
GROUP BY pb.Color, pb.Gender, pb.SizeNo, pb.Size, pb.PreBuyQty, od.Quantity, o.OrderID 
HAVING  (pb.Color LIKE N'Black') AND (pb.Gender LIKE N'Men') 
) As T 
PIVOT 
(
SUM(Quantity) FOR OrderID IN ([5277],[5294],[5365]) 
) As P; 

Ниже приведено то, что я сделал до сих пор, чтобы получить его динамически.

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 
select @cols = STUFF((SELECT ',' + QUOTENAME(o.OrderID) 
      FROM   Orders AS o INNER JOIN 
         OrderDetails AS od ON o.OrderID = od.OrderID INNER JOIN 
         ProductsPreBuy AS pb ON od.ProductCode = pb.productcode 
     GROUP BY pb.Color, pb.Gender, pb.Size, pb.PreBuyQty, od.Quantity, o.OrderID 
     HAVING  (pb.Color LIKE 'Black') AND (pb.Gender LIKE 'Men') 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

Set @query = 'SELECT pb.Color, pb.Gender, pb.Size, pb.PreBuyQty, od.Quantity,' + @cols + ' FROM 
(
SELECT pb.Color, o.OrderID, pb.Gender, pb.Size, pb.PreBuyQty, od.Quantity 
     FROM Orders AS o INNER JOIN OrderDetails AS od ON o.OrderID = od.OrderID INNER JOIN ProductsPreBuy AS pb ON od.ProductCode = pb.productcode 
GROUP BY pb.Color, pb.Gender, pb.Size, pb.PreBuyQty, od.Quantity, o.OrderID 
HAVING  (pb.Color LIKE 'Black') AND (pb.Gender LIKE 'Men') 
) x 
pivot 
(
    Sum(Quantity) 
    for OrderID in (' + @cols + ') 
    ) p ' 
execute @query 

ответ

1

Вы можете попробовать что-то вроде этого.

SELECT @cols = STUFF((SELECT ',' + QUOTENAME(o.OrderID) 
      FROM   Orders AS o INNER JOIN 
         OrderDetails AS od ON o.OrderID = od.OrderID 
         INNER JOIN ProductsPreBuy AS pb ON od.ProductCode = pb.productcode 
     WHERE (pb.Color = 'Black') AND (pb.Gender = 'Men') 
     GROUP BY pb.Color, pb.Gender, pb.Size, pb.PreBuyQty, od.Quantity, o.OrderID 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

Set @query = 'SELECT Color, Gender, Size, PreBuyQty,' + @cols + ' FROM 
(
SELECT pb.Color, o.OrderID, pb.Gender, pb.Size, pb.PreBuyQty, od.Quantity 
     FROM Orders AS o 
     INNER JOIN OrderDetails AS od 
      ON o.OrderID = od.OrderID 
     INNER JOIN ProductsPreBuy AS pb 
      ON od.ProductCode = pb.productcode 
WHERE (pb.Color = ''Black'') AND (pb.Gender = ''Men'') 
GROUP BY pb.Color, pb.Gender, pb.Size, pb.PreBuyQty, od.Quantity, o.OrderID 
) x 
PIVOT 
(
    Sum(Quantity) 
    for OrderID in (' + @cols + ') 
    ) p ' 
execute @query 

В запросе не нужно фильтровать, используя данные, используя HAVING, так как ваш фильтр не имеет агрегатную функцию. вы можете использовать простой пункт WHERE. Также в вашем фильтре нет подстановочных знаков. его лучше и чище использовать = в таких случаях.

+0

Ницца, я получал столбец несколько раз, но я положил в него, и он работал нормально. Благодаря agian – SouthernGentleman