繁体   English   中英

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

[英]SQL Server 2008 pivot without aggregate

我有一张表格来测试我需要轮换的得分数据,但我坚持如何做。

我有这样的数据:

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

基本上,我要做的是首先取消数据透视表,以获取包含成绩,测试类型和得分的表格,然后将其旋转以获取所需的答案。 我的未透视源数据包含TestType列,这一事实使得成绩和testype的每个组合都返回一个分数,因此所有聚合将仅返回该组合的特定分数,并且对其不执行任何操作。

我只对前4年级做过,但是我很确定您可以说出您需要添加什么才能使它在所有13年级中都起作用。

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

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM