没有聚合的SQL Server 2008数据透视

我有桌子来测试我需要转动的得分数据,我仍然坚持如何做到这一点。 我有这样的数据:
gradelistening speaking reading writing
0   0.0   0.0   0.0   0.0
1 399.4 423.8   0.0   0.0
2 461.6 508.4 424.2 431.5
3 501.0 525.9 492.8 491.3
4 521.9 517.4 488.7 486.7
5 555.1 581.1 547.2 538.2
6 562.7 545.5 498.2 530.2
7 560.5 525.8 545.3 562.0
8 580.9 548.7 551.4 560.3
9 602.4 550.2 586.8 564.1
10 623.4 581.1 589.9 568.5
11 633.3 578.3 598.1 568.2
12 626.0 588.8 600.5 564.8
但我需要这样:
  gr0 gr1 gr2 gr3 gr4 gr5 gr6 gr7 ...
listening 0.0 399.4 461.6 501.0 521.9 555.1 562.7 560.5 580.9...
speaking 0.0 423.8...
reading 0.0 0.0 424.2...
writing 0.0 0.0 431.5...
我不需要聚合任何东西,只需转动数据。     
已邀请:
以下是解决问题的一种方法,但我不确定它是否最有效。
DECLARE @PivotData table(grade int, listening float, speaking float, reading float, writing float)
INSERT into @PivotData
SELECT 0, 0.0, 0.0, 0.0, 0.0 UNION ALL
SELECT 1, 399.4, 423.8, 0.0, 0.0 UNION ALL
SELECT 2, 461.6, 508.4, 424.4, 431.5 UNION ALL
SELECT 3, 501.0, 525.9, 492.8, 491.3

SELECT TestType, [0] As gr0, [1] as gr1, [2] as gr2, [3] as gr3
FROM
(
    SELECT grade, TestType, score
    FROM 
    (
        SELECT grade, listening, speaking, reading, writing from @PivotData
    ) PivotData
    UNPIVOT
    (
        score for TestType IN (listening, speaking, reading, writing)
    ) as initialUnPivot
) as PivotSource
PIVOT 
(
    max(score) FOR grade IN ([0], [1], [2], [3])
) as PivotedData
基本上我所做的是最初将数据取消以获得一个包含等级,测试类型和得分的表,每个列都在其自己的列中,然后我转动数据以获得您想要的答案。我的UnPivoted源数据包含TestType列这一事实使得每个等级和测试类型的组合返回单个分数,因此所有聚合将仅返回该组合的特定分数,并且不会对其执行任何操作。 我只是为前4个年级做过,但我很确定你可以告诉你需要添加什么来让它适用于所有13个等级。     
这是一个解决方案。下面的代码使用Oracle的双表来为区域创建一个虚拟表(例如,收听,说话等);但是,对于SQLServer,我相信你可以截断每个联合中的'from dual'子句。查询执行笛卡尔积,以便将面向列的等级下拉为规范化结构(列技能,等级和分数)。然后以正常方式使用它来转动数据。我还添加了一个“rank”列,以便根据您指定的结果对数据进行排序。
select skill, rank
  , max(case grade when 0 then score else null end) gr0
  , max(case grade when 1 then score else null end) gr1
  , max(case grade when 2 then score else null end) gr2    
from (
  select skill, rank, grade
    , case skill when 'listening' then listening
                when 'speaking' then speaking
                when 'reading' then reading
                when 'writing' then writing end score
  from tmp_grade t,  (
    select 'listening' skill, 1 rank from dual
    union (select 'speaking', 2 from dual)
    union (select 'reading', 3 from dual)
    union (select 'writing', 4 from dual)
  ) area1
)
group by skill, rank
order by rank;
    

要回复问题请先登录注册