【问题标题】:How do I sort a SQL Server 2008 pivot result columns and rows?如何对 SQL Server 2008 数据透视结果列和行进行排序?
【发布时间】:2016-11-29 21:31:04
【问题描述】:

我正在使用This 来获取表格的数据透视结果。但我希望得到的列和行都以特定的顺序排列。因此,行将按CDATE 排序,列将是CDATEBALANCE,然后是DATE 列。

CDATE      | BALANCE | 04-2007 | 05-2007 | 06-2007 | TRANS TOT
2003-01-15 | 5000    | 60      | 0       | 0       | 60 
2003-02-15 | 4000    | 40      | 0       | 0       | 40
2003-03-15 | 5500    | 20      | 15      | 15      | 50 

【问题讨论】:

    标签: sql-server sql-server-2008 tsql pivot


    【解决方案1】:

    我编辑了您在问题中提供的链接中的答案以解决订购问题。只需将ORDER BY 子句添加到您的动态查询中:

    create table temp
    (
        date datetime,
        category varchar(3),
        amount money
    )
    
    insert into temp values ('1/1/2012', 'ABC', 1000.00)
    insert into temp values ('2/1/2012', 'DEF', 500.00)
    insert into temp values ('2/1/2012', 'GHI', 800.00)
    insert into temp values ('2/10/2012', 'DEF', 700.00)
    insert into temp values ('3/1/2012', 'ABC', 1100.00)
    
    
    DECLARE @cols AS NVARCHAR(MAX),
        @query  AS NVARCHAR(MAX);
    
    SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category) 
                FROM temp c
                FOR XML PATH(''), TYPE
                ).value('.', 'NVARCHAR(MAX)') 
            ,1,1,'')
    
    set @query = 'SELECT date, ' + @cols + ' from 
                (
                    select date
                        , amount
                        , category
                    from temp
               ) x
                pivot 
                (
                     max(amount)
                    for category in (' + @cols + ')
                ) p  ORDER BY date, ' + @cols 
    
    
    Execute(@query)
    
    drop table temp
    

    或者您可以使用common table expression 来实现此目的。像下面这样:

    set @query = 'WITH CTE_1(date, ' + @cols + ') AS (SELECT date, ' + @cols + ' from 
                (
                    select date
                        , amount
                        , category
                    from temp
               ) x
                pivot 
                (
                     max(amount)
                    for category in (' + @cols + ')
                ) p ) SELECT * FROM CTE_1 ORDER BY date, ' + @cols 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多