Sql server 2008 SQL Server 2008排名中包含一个数据轴
目前的结果:Sql server 2008 SQL Server 2008排名中包含一个数据轴,sql-server-2008,pivot,Sql Server 2008,Pivot,目前的结果: ID Keyid PersonID Rank ------------------------------------ 1 4678 9 1 1 4678 8 2 23 1234 7 1 2 4321 6 1 2 4321 5 2
ID Keyid PersonID Rank
------------------------------------
1 4678 9 1
1 4678 8 2
23 1234 7 1
2 4321 6 1
2 4321 5 2
我想看看结果
ID Keyid Rank1 Rank2
------------------------------------
1 4678 9 8
23 1234 7 blank
2 4321 6 5
当前查询:
SELECT top 1000
nm.ID,
aj.KEYID,
nm.PERSONID,
RANK() OVER(PARTITION BY nm.ID, aj.PERSONID ORDER BY nm.ID, aj.KEYID, nm.ID) as [Rank]
FROM
nm WITH(NOLOCK)
JOIN
aj WITH(NOLOCK) ON aj.KEYID = nm.KEYID
WHERE
ID IS NOT NULL and ID <> '' AND ID <> 0
GROUP BY
nm.ID, nm.PERSONID, aj.KEYID
选择前1000名
nm.ID,
aj.KEYID,
人格,
RANK()(按nm.ID、aj.PERSONID划分,按nm.ID、aj.KEYID、nm.ID排序)为[RANK]
从…起
nm带(NOLOCK)
参加
aj上带有(NOLOCK)的aj.KEYID=nm.KEYID
哪里
ID不为NULL,ID为“”,ID为0
分组
nm.ID,nm.PERSONID,aj.KEYID
我尝试了一个枢轴解决方案,但没有成功。任何帮助都将不胜感激,请记住,要显示的行有很多…您可以通过几种不同的方式获得所需的结果。您可以将聚合函数与一些条件逻辑一起使用,也可以使用PIVOT函数 具有条件逻辑的聚合函数,如CASE表达式:
select id, keyid,
Rank1 = max(case when [rank] = 1 then personid end),
Rank2 = max(case when [rank] = 2 then personid end)
from
(
--- replace with your current query
select id, keyid, personid,
[rank]
from yourquery
) d
group by id, keyid;
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME('Rank'+cast([rank] as varchar(2)))
from
(
select [rank]
from yourquery
) d
group by [rank]
order by [rank]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, keyid,' + @cols + '
from
(
--- replace with your current query
select id, keyid, personid,
[rank] = ''Rank''+cast([rank] as varchar(2))
from yourquery
) x
pivot
(
max(personid)
for [rank] in (' + @cols + ')
) p '
exec sp_executesql @query;
看
使用透视功能:
select id, keyid, rank1, rank2
from
(
--- replace with your current query
select id, keyid, personid,
[rank] = 'Rank'+cast([rank] as varchar(2))
from yourquery
) d
pivot
(
max(personid)
for [rank] in (Rank1, Rank2)
) piv;
看
现在您已经评论说,您将有一个未知数量的rank
值。在这种情况下,您必须使用动态sql来获取要转换为列的所有列的列表。守则是:
select id, keyid,
Rank1 = max(case when [rank] = 1 then personid end),
Rank2 = max(case when [rank] = 2 then personid end)
from
(
--- replace with your current query
select id, keyid, personid,
[rank]
from yourquery
) d
group by id, keyid;
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME('Rank'+cast([rank] as varchar(2)))
from
(
select [rank]
from yourquery
) d
group by [rank]
order by [rank]
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT id, keyid,' + @cols + '
from
(
--- replace with your current query
select id, keyid, personid,
[rank] = ''Rank''+cast([rank] as varchar(2))
from yourquery
) x
pivot
(
max(personid)
for [rank] in (' + @cols + ')
) p '
exec sp_executesql @query;
看。您将用当前查询替换此处使用的子查询,所有这些都将给出一个结果:
| ID | KEYID | RANK1 | RANK2 |
|----|-------|-------|--------|
| 23 | 1234 | 7 | (null) |
| 2 | 4321 | 6 | 5 |
| 1 | 4678 | 9 | 8 |
正在尝试创建子查询以生成我想要的结果。您是否打算每人只拥有2个列组?不,我可以每人拥有超过2个列组。我猜无法创建我想要的结果?我会接受别人可能提出的任何其他建议。