0

我有表格来测试我需要转换的分数数据,但我一直不知道该怎么做。

我有这样的数据:

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...

我不需要聚合任何东西,只需旋转数据即可。

4

2 回答 2

2

以下是解决问题的一种方法,但我不确定它是否最有效。

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 列这一事实使得 Grade 和 testype 的每个组合都返回一个分数,因此所有聚合将只返回该组合的特定分数,并且不会对其执行任何操作。

我只为前 4 个年级做过,但我很确定你能说出你需要添加什么才能让它适用于所有 13 个年级。

于 2010-03-22T17:54:23.027 回答
0

这是一个解决方案。下面的代码使用Oracle 的对偶表为各个领域(例如听力、口语等)创建一个虚拟表;但是,对于 SQLServer,我相信您可以在每个联合中截断“从双重”子句。该查询执行笛卡尔积,以便将面向列的成绩下拉为规范化结构(列技能、成绩和分数)。然后以正常方式使用它来旋转数据。我还添加了一个“排名”列,以便可以根据您指定的结果对数据进行排序。

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;
于 2010-03-22T17:45:58.983 回答