Группировка наборов: отображать промежуточные итоги в другом конкретном столбце? - PullRequest
1 голос
/ 27 октября 2011

можно отобразить промежуточные итоги в другом конкретном столбце?

SELECT deptno,empno,SUM(sal) as sum_salary
FROM emp_test 3 
GROUP BY GROUPING SETS
((DeptNo,Empno),(DeptNo),())

На самом деле я получаю этот результат:

DEPTNO      EMPNO   SUM(SAL)
10       7782      20000
10       7839      10000
10                 30000
20       7566       5950
20       7788       6000
20       7902       6000
20                 17950
30       7698      20000
30       7699      20000
30                 40000
                   87950

Как я могу получить это? :

DEPTNO      EMPNO   SUM(SAL)  Subtotals

10       7782      20000
10       7839      10000
10                            30000
20       7566       5950
20       7788       6000
20       7902       6000
20                            17950
30       7698      20000
30       7699      20000
30                            40000

Примечание: я не могу использовать ROLLUP или CUBE.

Спасибо

Ответы [ 3 ]

1 голос
/ 27 октября 2011

Я согласен с Джейми, возможно, вы хотите, чтобы промежуточные итоги визуально обрабатывались в другом слое, но вы можете попробовать использовать функцию GROUPING() в столбце. Эта функция возвращает 1, если она является частью промежуточных итогов GROUPING SETS, и 0, если это обычный столбец. http://technet.microsoft.com/en-us/library/ms178544(SQL.90).aspx

Я включил образцы данных, которые я тестировал. Удалите первый WITH emp_test AS () при использовании оператора выбора.

Мои данные испытаний:

WITH emp_test AS
(
   SELECT 10 AS DEPTNO, 7782 AS EMPNO, 20000 AS sal
   UNION ALL SELECT 10, 7839, 10000
   UNION ALL SELECT 20, 7566, 5950
   UNION ALL SELECT 20, 7788, 6000
)

Ответ, чтобы получить промежуточные итоги в отдельной колонке:

SELECT deptno, empno
   , CASE
      WHEN GROUPING(empNo) = 1 THEN null
      ELSE SUM(sal)
     END as sum_salary
   , CASE
      WHEN GROUPING(empno) = 1 THEN SUM(sal)
      ELSE NULL
     END AS SubTotal
FROM emp_test
GROUP BY GROUPING SETS (DeptNo, Empno), (DeptNo)
0 голосов
/ 27 октября 2011

Используйте внешний выбор для переформатирования столбцов:

select deptno, empno, 
    CASE WHEN empno is null THEN "" ELSE "sum_salary" END, 
    CASE WHEN empno is null THEN "sum_salary" ELSE "" END
from ( SELECT deptno,empno,SUM(sal) as sum_salary  FROM emp_test 3   
       GROUP BY GROUPING SETS  ((DeptNo,Empno),(DeptNo)) );
0 голосов
/ 27 октября 2011

В SqlServer (2005+) вы можете использовать команду ROLLUP для получения данных такого типа

SQL 2005

SELECT DeptNo, EmpNo, SUM(SAL),
   FROM myTable
   GROUP BY DeptNo, EmpNo WITH ROLLUP

или в 2008

SELECT DeptNo, EmpNo, SUM(SAL),
   FROM myTable
   GROUP BY ROLLUP(DeptNo, EmpNo)

РЕДАКТИРОВАТЬ:

В идеале, это будет использовать ROLLUP, а затем обрабатывать данные в пользовательском интерфейсе или манипулировать им на уровне бизнес-логики (или даже в пользовательском интерфейсе) для отображения данных по мере необходимости.

НО, если вам нужно сделать это в SQL Server, то вы можете построить таблицу TEMP в функции или хранимой процедуре, чтобы предоставить вам необходимые данные, но для этого потребуется несколько проходов в данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...