【问题标题】:How to perform Sql pivot without aggregation and with order by?如何在没有聚合和 order by 的情况下执行 Sql pivot?
【发布时间】:2017-01-21 06:18:27
【问题描述】:

我有 Persons 表,如图所示,我想将其转换为 Table2

Table Image

这就是我尝试在 Sql Server 中构建查询的方式,但我不知道用什么来代替聚合函数,还有一件事是我希望在各个国家/地区按字母顺序排列所有人的姓名,如图所示.

Select Usa ,India, Uk from Persons

pivot
(
Aggregate(i_dont_know) for Country in ([Usa],[India],[Uk])
)

【问题讨论】:

    标签: sql sql-server pivot pivot-table


    【解决方案1】:

    您可以使用MAX/MIN 聚合和Row_number

    SELECT *
    FROM   (SELECT Row_number()OVER(partition BY country ORDER BY NAME) AS rn,*
            FROM   Persons b) a
           PIVOT ( Max(NAME)
                 FOR Country IN ([Usa],
                                 [India],
                                 [Uk]) ) pv 
    order by rn
    

    没有Row_Number,您将获得每个国家/地区的maxmin 名称。

    如果国家数量未知,那么

    DECLARE @sql      VARCHAR(8000) ='',
            @col_list VARCHAR(8000)= ''
    
    SELECT @col_list = (SELECT ',' + Quotename(NAME)
                        FROM   Persons
                        GROUP  BY NAME
                        FOR xml path(''))
    
    SET @col_list = Stuff(@col_list, 1, 1, '')
    SET @sql = 'SELECT *
    FROM   (SELECT Row_number()OVER(partition BY country ORDER BY NAME) AS rn,*
            FROM   Persons b) a
           PIVOT ( Max(NAME)
                 FOR Country IN (' + @col_list
               + ') ) pv order by rn'
    
    PRINT @sql
    
    EXEC (@sql) 
    

    【讨论】:

    • @huzefa - 你有什么错误吗?这只是第一个解决方案的动态版本
    • 没有错误,但没有给出正确的答案。顺便说一句,我想通了。在 select 语句而不是 name 中,我们需要在 quotename() 中写入国家并按两者分组
    【解决方案2】:

    你可以做这样的事情,这不是一个支点,但这样你就可以把你的名字分组:

    select 
        max(case when country = 'Usa' then name end) as Usa,
        max(case when country = 'Uk' then name end) as Uk,
        max(case when country = 'India' then name end) as India
    from
    (
        select 
            name, 
            country, 
            row_number() over (partition by country order by name) as RN
        from persons
    ) X
    group by RN
    order by RN
    

    【讨论】:

      【解决方案3】:

      试试这个聚合最小值/最大值

      SELECT Usa ,India, Uk from Persons
      PIVOT
      (   MIN([Name]) 
          FOR [Country] IN ([Usa], [India], [Uk]) 
      )AS p
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多