7

我正在对包含以下内容的表进行动态数据透视查询:

  • OID - 订单 ID
  • 尺寸 - 产品尺寸
  • BucketNum - 尺寸的顺序
  • 数量 - 订购的数量

大小列包含不同的大小,具体取决于 OID。

所以,使用在这里找到的代码,我把它放在一起:

DECLARE @listCol VARCHAR(2000)
DECLARE @query VARCHAR(4000)

SELECT  @listCol = STUFF(( SELECT distinct  '], [' + [size]
                           FROM     #t
                         FOR
                           XML PATH('')
                         ), 1, 2, '') + ']'


SET @query = 'SELECT * FROM
      (SELECT OID,  [size], [quantity]
            FROM #t 
            ) src
PIVOT (SUM(quantity) FOR Size
IN (' + @listCol + ')) AS pvt'


EXECUTE ( @query )

这很好用,除了列标题(大小标签)不是基于 bucketnum 列的顺序。这些是基于大小的顺序。

我在枢轴之后尝试了可选的 Order By,但这不起作用。

如何控制列出现的顺序?

谢谢

4

4 回答 4

11

你需要解决这个问题:

SELECT  @listCol = STUFF(( SELECT distinct  '], [' + [size]
                           FROM     #t
                         FOR
                           XML PATH('')
                         ), 1, 2, '') + ']'

以正确的顺序返回列。你可能不得不做这样的事情而不是使用DISTINCT

SELECT [size]
FROM     #t
GROUP BY [size]
ORDER BY MIN(BucketNum)
于 2009-07-13T21:25:18.463 回答
3
SELECT @listCol = STUFF(
        (SELECT DISTINCT ',' + QUOTENAME(size) AS [size]
        FROM #t
        ORDER BY [size]
        FOR XML PATH('')
于 2015-06-11T17:24:01.187 回答
0

我今天才看到这个链接,它使用 CTE 即时构建列列表(可能您可以订购),而不需要动态 sql:

http://blog.stevienova.com/2009/07/13/using-ctes-to-create-dynamic-pivot-tables-in-sql-20052008/

于 2009-07-13T21:34:55.700 回答
0

我遇到了同样的问题并尝试了上面建议的解决方案,但可能由于我的理解水平,无法让它发挥作用。我发现一个简单的技巧是使用 Order by 语句创建一个列标题正确排序的临时表,然后将该列表拉入设置动态透视查询列名的变量。

例如

SELECT WeekNum INTO #T3 
FROM #T2 
GROUP BY WeekNum 
ORDER BY MIN(WeekNum) 

SELECT @ColumnName1 = ISNULL(@ColumnName1 + ',','') + QuoteName(WeekNum) 
FROM (SELECT WeekNum From #T3) AS WeekNum

工作了一个款待。

希望对某人有所帮助。

于 2014-07-23T09:52:15.587 回答