如何在没有聚合和排序的情况下执行 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
,您将获得每个国家/地区的 max
或 min
名称。
如果国家数量未知,则
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
我有 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
,您将获得每个国家/地区的 max
或 min
名称。
如果国家数量未知,则
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