【问题标题】:Trouble with SQL Server Dynamic PivotSQL Server 动态数据透视问题
【发布时间】:2015-06-08 04:34:54
【问题描述】:

我创建了一个静态枢轴很好,但是当我创建动态版本时,我不断收到错误,例如 HAVING 子句中的语法错误以及其他错误,例如无效的标识符。

 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

【问题讨论】:

    标签: sql-server dynamic pivot


    【解决方案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 子句。您的过滤器中也没有通配符。在这种情况下使用= 会更好、更干净。

    【讨论】:

    • 很好,我多次收到一列错误,但我输入了 distinct,它工作得很好。谢谢阿甘
    猜你喜欢
    • 2017-07-28
    • 2014-10-16
    • 2014-07-26
    • 1970-01-01
    • 2013-02-09
    • 2018-11-22
    • 1970-01-01
    • 2010-11-27
    • 2011-10-16
    相关资源
    最近更新 更多