Сводная таблица SQL Server 2008 без агрегата - PullRequest
0 голосов
/ 22 марта 2010

У меня есть таблица для проверки данных оценки, которые мне нужно повернуть, и я застрял на том, как это сделать.

У меня есть данные как это:это так:

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

Мне не нужно ничего агрегировать, просто сводите данные.

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Ниже приведен один из способов решения проблемы, но я не уверен, является ли он наиболее эффективным.

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, делает так, что каждая комбинация оценки и тестового типа возвращает одну оценку, поэтому все агрегаты просто возвращают эту конкретную оценку для комбинации и ничего с ней не выполняют.1005 * Я сделал это только для первых 4 классов, но я уверен, что вы можете сказать, что вам нужно добавить, чтобы это работало для всех 13 классов.

0 голосов
/ 22 марта 2010

Вот решение. В приведенном ниже коде используется двойная таблица Oracle для создания фиктивной таблицы для областей (например, прослушивание, говорение и т. Д.); однако для SQLServer, я полагаю, вы можете просто обрезать предложение from from внутри каждого объединения. Запрос выполняет декартово произведение, чтобы свести оценки, ориентированные на столбцы, в нормализованную структуру (навык столбцов, оценка и оценка). Затем это используется обычным способом для поворота данных. Я также добавил столбец «ранг», чтобы данные могли быть отсортированы по указанным вами результатам.

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