SQL动态透视 - 如何排序列SQL动态透视 - 如何排序列(SQL Dynamic Pivot -

2019-06-14 06:26发布

我正在上包含表动态支点查询:

  • 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列顺序的伟大工程。 的是基于大小的顺序。

我已经试过了可选的订单由枢轴之后,但不工作。

如何控制这些列的显示顺序?

谢谢

Answer 1:

你需要解决这个问题:

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)


Answer 2:

SELECT @listCol = STUFF(
        (SELECT DISTINCT ',' + QUOTENAME(size) AS [size]
        FROM #t
        ORDER BY [size]
        FOR XML PATH('')


Answer 3:

我看到这个链接就在今天,它采用了CTE打造列列表(其中,想必,你可以命令)在飞行而不需要动态SQL:

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



Answer 4:

我有同样的问题,并试图解决上述建议,但可能是由于我的了解程度,无法得到它的工作。 我发现了一个简单的黑客是创建临时表正确排序的列标题使用排序语句,然后在该列表拉那台动力支点查询列名的变量。

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

工作一种享受。

希望可以帮助别人。



文章来源: SQL Dynamic Pivot - how to order columns