Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 SQL Server 2008排名中包含一个数据轴_Sql Server 2008_Pivot - Fatal编程技术网

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个列组。我猜无法创建我想要的结果?我会接受别人可能提出的任何其他建议。