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

以下は問題を解決する 1 つの方法ですが、それが最も効率的かどうかはわかりません。

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 の場合、各ユニオン内の「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;
于 2010-03-22T17:45:58.983 に答える