2017-01-31 10 views
1

У меня есть таблица показателей (например, количество студентов) для школ в ряде районов.Как объединить таблицу и агрегированные результаты в SQL

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

у меня есть:

district school students 
District1 School1 10 
District2 School2 20 
District1 School3 30 
District2 School4 40 
District1 School5 50 
District2 School6 60 

Я хотел бы, чтобы в конечном итоге получить в та же таблица:

district school students 
District1 School1 10 
District2 School2 20 
District1 School3 30 
District2 School4 40 
District1 School5 50 
District2 School6 60 
District1 Total 90 
District2 Total 120 

Я попытался

SELECT district, school, students 
FROM enrolment 
UNION 
SELECT district, "Total" as school, sum(students) 
FROM enrolment 
GROUP BY district; 

, но я на самом деле вытаскиваю много индикаторов из множества разных запросов и объединяюсь на двух дополнительных уровнях (штатах и ​​странах), поэтому он очень медленный. Есть ли наиболее эффективный способ сделать это?

+1

Какие РСУБД? Microsoft SQL Server? MySQL? Oracle? –

+1

Имея итоговые значения в одной таблице или запросе, не имеет смысла. Переосмыслить то, что вы действительно хотите. Подумайте об этом: имеет ли смысл «Total» под колонкой «школа»? –

+1

@NazarMerza Это не обязательно плохая идея. Это в основном то, что делает ROLLUP ... – Jerrad

ответ

1

Если вы используете SQL-сервер можно использовать ROLLUP:

SAMPLE DATA:

CREATE TABLE #enrolment(district VARCHAR(25) 
        , school VARCHAR(25) 
        , students INT); 

INSERT INTO #enrolment 
VALUES 
     ('District1' 
    , 'School1' 
    , 10), 
     ('District2' 
    , 'School2' 
    , 20), 
     ('District1' 
    , 'School3' 
    , 30), 
     ('District2' 
    , 'School4' 
    , 40), 
     ('District1' 
    , 'School5' 
    , 50), 
     ('District2' 
    , 'School6' 
    , 60); 

QUERY:

SELECT district 
    , ISNULL(school, 'Total') AS school 
    , SUM(students) AS students 
FROM #enrolment 
GROUP BY ROLLUP(district, school); 

РЕЗУЛЬТАТ:

enter image description here

+0

Это замечательно, но я работаю над Access на данный момент ... – reluck