Группировка SQL

http://agricam.net/test.gif

Мне нужно динамически добавить строку в SQL после того, как номер маркетолога изменится с заголовком «Итого маркетолога», который должен добавить только столбец «Итого». Например, после последней строки строки «Маркетолог 22» должно быть «Итого по маркетологу», а затем под столбцом «Итого» должно быть 1804. То же самое должно произойти после последней строки «Маркетолог 500».

См. изображение по адресу http://agricam.net/test.gif.

Текущий запрос:

выберите Marketer, SubMarketer, Grade, Total, Convert(varchar,Date,101)[Date] из SomeTable, где Date>= '25/2009' и Date ‹ '26/2009' и Marketer in ('22' ,'500') группа по субмаркетологу, классу, маркетологу, дате, общий порядок по маркетологу

Спасибо.


person egjoni    schedule 26.02.2009    source источник
comment
предоставить структуру таблиц и текущий запрос выбора   -  person Maksym Gontar    schedule 27.02.2009


Ответы (4)


см. Использование ROLLUP для агрегирования данных в SQL

реализация:

DECLARE @SOMETABLE TABLE (SUBMARKETER INT, GRADE CHAR, MARKETER INT, 
  DATE DATETIME, TOTAL INT)
INSERT INTO @SOMETABLE
SELECT 1415, 'A', 22, '02/25/2009', 26 UNION
SELECT 1415, 'B', 22, '02/25/2009', 93 UNION
SELECT 1415, 'C', 22, '02/25/2009', 1175 UNION
SELECT 1415, 'D', 22, '02/25/2009', 510 UNION
SELECT 1169, 'B', 500, '02/25/2009', 1 UNION
SELECT 1169, 'C', 500, '02/25/2009', 3 UNION
SELECT 1393, 'C', 500, '02/25/2009', 2 UNION
SELECT 2, 'B', 500, '02/25/2009', 5 UNION
SELECT 2, 'C', 500, '02/25/2009', 111 UNION
SELECT 2, 'D', 500, '02/25/2009', 18 

SELECT 
  CASE WHEN SUBMARKETER IS NULL THEN 'Marketer Total' 
    ELSE CONVERT(VARCHAR, MARKETER) END MARKETER, 
    SUBMARKETER, GRADE, TOTAL, DATE 
  FROM (
    SELECT MARKETER, SUBMARKETER, GRADE, SUM(TOTAL) AS TOTAL, 
    CONVERT(VARCHAR,DATE,101)[DATE] 
    FROM @SOMETABLE 
    WHERE DATE >= '2/25/2009' AND DATE < '2/26/2009' 
     AND MARKETER IN ('22','500') 
    GROUP BY MARKETER, SUBMARKETER, GRADE, DATE WITH ROLLUP
)M 
WHERE M.MARKETER IS NOT NULL 
AND NOT (SUBMARKETER IS NOT NULL AND DATE IS NULL)

внимание: это будет работать нормально, если столбцы MARKETER, SUBMARKETER и DATE НЕ NULL. Если в таблице будут значения NULL для этих полей, это станет проблемой для фильтрации бесполезной группировки.

person Maksym Gontar    schedule 26.02.2009
comment
ROLLUP() и PARTITION() с использованием номера маркетолога должны вам помочь. Хотя он сложный. Удачи. - person achinda99; 27.02.2009
comment
Я играл с этой идеей, но я не могу заставить ее делать правильные вещи. - person egjoni; 27.02.2009

Я считаю, что вы также можете использовать COMPUTE SUM

person MikeW    schedule 26.02.2009
comment
Я попробовал ваше предложение, но похоже, что общая сумма для каждого маркетолога была возвращена в отдельном наборе результатов. - person Maksym Gontar; 27.02.2009
comment
Как говорится в ссылке, COMPUTE устарел - вместо этого используйте ROLLUP. - person Jon Seigel; 20.05.2010

Ответ Колдиса правильный. Если у вас нет веских причин для хранения агрегированных данных в таблице, механизм запросов достаточно мощный, чтобы сделать это за вас. Можете ли вы объяснить, зачем вам нужна эта строка в таблице? Это для демонстрации? Вы можете использовать функцию ROLLUP, чтобы поместить совокупные результаты в запрос, или вы можете запустить отдельный запрос, например, чтобы посеять итоги:

SELECT marketer, SUM(total) FROM TablenameHere GROUP BY marketer
person Christian Loris    schedule 26.02.2009
comment
Это отчет... поэтому данные должны быть показаны в разбивке - person egjoni; 27.02.2009
comment
Большинство механизмов отчетности поддерживают групповые итоги. Какой генератор отчетов вы используете? - person Ken White; 27.02.2009
comment
Я просто пишу запрос на SQL. - person egjoni; 27.02.2009
comment
Прими решение. :-) В комментарии над моим написано, что это отчет. Это либо отчет, либо SQL-запрос. Если это отчет, как говорится в вашем комментарии, что-то выводит его, и это что-то должно иметь возможность суммировать группы. Если это просто SQL, вероятно, лучше всего подойдет ROLLUP. - person Ken White; 27.02.2009

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

person Gregory A Beamer    schedule 26.02.2009
comment
Если есть миллионы и миллионы строк, это может быть хорошей стратегией для использования триггеров для поддержки сводной таблицы. Но должно быть много. Вам также придется запускать пересчет итогов при обновлении и удалении триггеров. - person Christian Loris; 27.02.2009
comment
Я думаю, что лучшим способом было бы пройти через Grouping/ROLLUP, просто трудно заставить его показать именно то, что мне нужно. - person egjoni; 27.02.2009
comment
У меня нет проблем ни с суммированием, ни с денормализацией. Любой из них может быть допустимым методом решения проблемы. Как вы сказали, это действительно зависит. - person Gregory A Beamer; 27.02.2009