如何在没有聚合和排序的情况下执行 Sql 数据透视?

How to perform Sql pivot without aggregation and with order by?

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

Table Image

这就是我尝试在 Sql 服务器中构建查询的方式,但我不知道该写什么来代替聚合函数,还有一件事是我希望所有人的姓名按字母顺序排列各自的国家如图所示。

Select Usa ,India, Uk from Persons

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

您可以使用 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) 

试试这个聚合 MIN/MAX

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

你可以这样做,这不是一个枢轴,但这样你就可以将你的名字分组:

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