2015-04-03 78 views
0

我創建了一個Static Pivot就好了,但是當我做了動態版本時,我不斷收到像HAVING Clause中的錯誤語法和其他錯誤(如無效標識符)的錯誤。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

不錯,我得到一個列多次錯誤,但我把獨特的,它工作得很好。謝謝你 – SouthernGentleman 2015-04-03 18:43:08