代码之家  ›  专栏  ›  技术社区  ›  Chris Burgess

SQL动态透视-如何排序列

  •  6
  • Chris Burgess  · 技术社区  · 15 年前

    我正在处理一个包含以下内容的表的动态透视查询:

    • 类有序
    • 尺寸-产品尺寸
    • 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列不一致。根据大小按顺序排列。

    我试过在枢轴之后执行可选的命令,但这不起作用。

    如何控制列的显示顺序?

    谢谢你

    4 回复  |  直到 9 年前
        1
  •  7
  •   Cade Roux    15 年前

    您需要修复此问题:

    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)
    
        2
  •  3
  •   josliber Martin Ballet    9 年前
    SELECT @listCol = STUFF(
            (SELECT DISTINCT ',' + QUOTENAME(size) AS [size]
            FROM #t
            ORDER BY [size]
            FOR XML PATH('')
    
        3
  •  0
  •   Joel Coehoorn    15 年前

    我刚刚看到了这个链接,它使用CTE来构建列列表(大概可以订购),而不需要动态SQL:

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

        4
  •  0
  •   talegna    10 年前

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

    例如

    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
    

    干了一顿饭

    希望能帮助别人。

    推荐文章