【问题标题】:SQL Dynamic Pivot - how to order columnsSQL Dynamic Pivot - 如何对列进行排序
【发布时间】:2009-07-13 21:16:28
【问题描述】:

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

  • OID - 订单 ID
  • 尺寸 - 产品尺寸
  • BucketNum - 大小的顺序 应该去
  • 数量 - 订购数量

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

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

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,但这不起作用。

如何控制列的显示顺序?

谢谢

【问题讨论】:

    标签: sql-server-2005 pivot dynamic-pivot


    【解决方案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)
    

    【讨论】:

    • 啊啊啊啊! 'MIN(BucketNum)'位是我需要的!谢谢,谢谢!
    【解决方案2】:
    SELECT @listCol = STUFF(
            (SELECT DISTINCT ',' + QUOTENAME(size) AS [size]
            FROM #t
            ORDER BY [size]
            FOR XML PATH('')
    

    【讨论】:

    • 虽然这个查询可以回答这个问题,你能提供更多关于这个答案是如何工作的信息吗?
    • 它的工作方式与原始帖子中的代码相同,但它为列创建了一个别名,以便它可以应用 ORDER BY。
    【解决方案3】:

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

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

    【讨论】:

    • 该解决方案仅在列名而非列数上是非动态的,这在枢轴操作时仍需要动态技术。我已经使用该技术来旋转可变日期范围,但是它始终是 12 个月,但从不同的月份开始 - 这是一个基本的滑动变换。
    【解决方案4】:

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

    例如

    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
    

    辛苦了。

    希望对某人有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 2012-11-25
      • 2015-11-10
      • 1970-01-01
      • 2020-01-15
      相关资源
      最近更新 更多