2015-10-20 112 views
0

是否有更好的方法来实现下表中的PIVOT - 基本上我试图计算typeid的永远userid,以及获得每种类型的第一个值,并将类型和值(使用SQL Server 2012):PIVOT两列

enter image description here

这是预期的结果:

enter image description here

这里就是我想出了:

SELECT userid , 
     MAX([1]) [1] , 
     MAX([2]) [2] , 
     MAX(value1) [value1] , 
     MAX(value2) [value2] 
FROM (SELECT userid , 
        typeid , 
        FIRST_VALUE(value) OVER (PARTITION BY userid, typeid ORDER BY testid) [value] , 
        'value' + CONVERT(VARCHAR(20), typeid) [valuepivot] 
      FROM  dbo.test 
     ) t PIVOT(COUNT(typeid) FOR typeid IN ([1], [2])) as pivottype 
     PIVOT(MAX(value) FOR [valuepivot] IN ([value1], [value2])) as pivottype2 
GROUP BY userid 

表模式:

CREATE TABLE [dbo].[Test](
      PIVOT(MAX(value) FOR [valuepivot] IN ([value1], [value2])) as pivottype2 
    [TestID] [int] PRIMARY KEY IDENTITY(1,1) , 
    [UserID] [int] NOT NULL, 
    [TypeID] [int] NOT NULL, 
    [Value] [varchar](100) NOT NULL 
) 
    GROUP BY userid 
+0

看来您的代码目前正常工作,而您正在寻求改进它。通常,这些问题都太自以为是了这个网站,但你可能会发现更好的运气在[CodeReview.SE(http://codereview.stackexchange.com/tour)。请记住阅读[他们的要求](http://codereview.stackexchange.com/help/on-topic),因为它们比这个网站更严格。 –

回答

0

我只想做到这一点使用条件汇总:

select userid, 
     sum(case when typeid = 1 then 1 else 0 end) as test1, 
     sum(case when typeid = 2 then 1 else 0 end) as test2, 
     max(case when typeid = 1 then value end) as test1, 
     max(case when typeid = 2 then value end) as test2 
from (select t.*, 
      row_number() over (partition by userid, typeid order by testid) as seqnum 
     from test 
    ) t 
group by userid; 

无论是简单与否见仁见智。