Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 具有多个值的轴列_Sql_Sql Server_Pivot - Fatal编程技术网

Sql 具有多个值的轴列

Sql 具有多个值的轴列,sql,sql-server,pivot,Sql,Sql Server,Pivot,表温度: ID Name Hobbies 1 xxx Reading 1 xxx Sports 1 xxx Dance 2 xyz Dance 3 yyy Swimming 3 yyy Reading 现在,我希望结果集为: ID Name Hobby1 Hobby2 Hobby3 1 x

表温度:

ID    Name        Hobbies
1     xxx          Reading
1     xxx          Sports
1     xxx          Dance
2     xyz          Dance
3     yyy          Swimming
3     yyy          Reading
现在,我希望结果集为:

ID   Name    Hobby1     Hobby2    Hobby3 
1    xxx     Reading    Sports    Dance         
2    xyz     Cooking                  
3    yyy     Coloring   Swimming        

如何做到这一点?我使用了多个嗜好值,因此无法硬编码。

因为您知道每个姓名的最大嗜好数,所以可以为每个姓名生成行号并将其用于旋转

;with data as
(
SELECT row_number()over(partition by [ID] order by [Hobbies])rn,*
FROM   ( VALUES (1,'xxx','Reading'),
                (1,'xxx','Sports'),
                (1,'xxx','Dance'),
                (2,'xyz','Dance'),
                (3,'yyy','Swimming'),
                (3,'yyy','Reading')) tc ([ID], [Name], [Hobbies])
)
SELECT [ID],
       [Name],
       [Hobby1] = Max(CASE WHEN rn = 1 THEN [Hobbies] END),
       [Hobby2] = Max(CASE WHEN rn = 2 THEN [Hobbies] END),
       [Hobby3] = Max(CASE WHEN rn = 3 THEN [Hobbies] END)
FROM   data
GROUP  BY [ID],
          [Name] 
结果:

像这样试试

DECLARE @tbl TABLE(ID INT,Name VARCHAR(100),Hobbies VARCHAR(100));
INSERT INTO @tbl VALUES
 (1,'xxx','Reading')
,(1,'xxx','Sports')
,(1,'xxx','Dance')
,(2,'xyz','Dance')
,(3,'yyy','Swimming')
,(3,'yyy','Reading');

SELECT p.*
FROM
(
    SELECT tbl.*
          ,'Hobby' + CAST(ROW_NUMBER() OVER(PARTITION BY tbl.Name ORDER BY tbl.ID) AS VARCHAR(10)) AS ColumnName
    FROM @tbl AS tbl
) AS t
PIVOT
(
    MAX(Hobbies) FOR ColumnName IN(Hobby1,Hobby2,Hobby3,Hobby4 /*add more if needed*/)
) AS p
结果

ID  Name    Hobby1   Hobby2  Hobby3 Hobby4
1   xxx     Reading  Sports   Dance NULL
2   xyz     Dance    NULL     NULL  NULL
3   yyy     Swimming Reading  NULL  NULL
试试这个

            select ID  , Name  ,  Hobby1    , Hobby2  ,  Hobby3 
             from
             (
             select 
            ID , Name,Hobbies, 
                case when Hobyno ='1' then 'Hobby1' 
                when Hobyno ='2' then 'Hobby2' 
                when Hobyno ='3' then 'Hobby3' 
                else null end as HobyNo 
            from

            (
             select   *,ROW_NUMBER() OVER ( PARTITION  BY id order by id ) HobyNo
              from   #temp
            )a
            where a.HobyNo <4  -- Add if you want more than 3 hobbie also edit case when
             )a 

            pivot
            (
              max(Hobbies)
              for Hobyno in ([Hobby1],[Hobby2],[Hobby3] )
            ) piv;

搜索动态数据透视假设我最多有3个爱好。。所以我想没有必要使用动态pivot..你提到过我使用了多个爱好值,所以我不能硬编码。另外,如果你知道兴趣爱好的最大数量,那么在Sql Server中搜索Pivot我的意思是有更多的兴趣爱好,如烹饪、阅读、游泳、着色等等,但是对于每个成员来说,最多有3个。关于这一点,这里有很多类似的问题。在这个问题上:不尝试,不努力,不寻求解决方案。即使是MSDN关于的文章也给出了基本的解释和示例。它的工作原理与预期一致。我能为两个专栏做同样的事情吗,比如兴趣爱好和资格证书。也就是说,qual1,qual2Ok。给出带有表结构和所需O/pTable:ID名称的示例代码Qualifications@Nandy枢轴有两种方式。与GROUP BY和MAXCASE一起使用的老式产品。。。正如Prdp的答案和我的答案一样。以上两种方法毫无理由地结合在一起…@Nandy-通过我的方法,您对旋转两列的新要求可以很容易地得到满足。。如果需要pivot语法,则需要使用pivot两次
            select ID  , Name  ,  Hobby1    , Hobby2  ,  Hobby3 
             from
             (
             select 
            ID , Name,Hobbies, 
                case when Hobyno ='1' then 'Hobby1' 
                when Hobyno ='2' then 'Hobby2' 
                when Hobyno ='3' then 'Hobby3' 
                else null end as HobyNo 
            from

            (
             select   *,ROW_NUMBER() OVER ( PARTITION  BY id order by id ) HobyNo
              from   #temp
            )a
            where a.HobyNo <4  -- Add if you want more than 3 hobbie also edit case when
             )a 

            pivot
            (
              max(Hobbies)
              for Hobyno in ([Hobby1],[Hobby2],[Hobby3] )
            ) piv;