|
Программирование >> Преобразование значений null
Решение Чтобы обозначить, какие из значений получены благодаря выполнению CUBE или ROLLUP, а какие из них являются суперагрегатными, используйте функцию GROUPING. Ниже представлен пример для DB2 и Oracle: 1 select deptno, job, sum(sal) sal, 2 grouping(deptno) deptno subtotals, 3 grouping(job) job subtotals 4 from emp 5 group by cube(deptno,job) Решение для SQL Server отличается от решения для DB2 и Oracle только записью операторов CUBE/ROLLUP: 1 select deptno, job, sum(sal) sal, 2 grouping(deptno) deptno subtotals, 3 grouping(job) job subtotals 4 from emp 5 group by deptno,job with cube Этот рецепт посвящен использованию CUBE и GROUPING при работе с подсуммами. На момент написания данной книги PostgreSQL и MySQL не поддерживают ни CUBE, ни GROUPING. Обсуждение Если DEPTNO SUBTOTALS равно 1, то значение поля SAL представляет подсумму по DEPTNO, созданную CUBE. Если JOB SUBTOTALS равно 1, то значение поля SAL представляет подсумму по JOB, созданную CUBE. Если в обоих столбцах, JOB SUBTOTALS и DEPTNO SUB- TOTALS, располагается 1, значение SAL представляет общую сумму всех заработных плат, сформированную CUBE. Строки, в которых оба значения, DEPTNOSUBTOTALS и JOBSUBTOTALS, равны 0, созданы в результате обычной агрегации (значение SAL представляет сумму заработных плат для каждого сочетания DEPTNO/JOB). Использование выражений CASE для маркировки строк Задача Требуется представить значения столбца, скажем, столбца JOB таблицы EMP, в виде набора логических флагов. Например, необходимо получить следующее результирующее множество: ENAME IS CLERK IS SALES IS MGR IS ANALYST IS PREZ KING 0 0 0 0 1 SCOTT 0 0 0 1 0 FORD 0 0 0 1 0 JONES 0 0 1 0 0 BLAKE 0 0 1 0 0 CLARK 0 0 1 0 0 ALLEN 0 1 0 0 0 WARD 0 1 0 0 0 MARTIN 0 1 0 0 0 TURNER 0 1 0 0 0 SMITH 1 0 0 0 0 MILLER 1 0 0 0 0 ADAMS 1 0 0 0 0 JAMES 1 0 0 0 0 Подобное результирующее множество может использоваться для отладки и для представления данных иначе, чем предлагают обычные результирующие множества. Решение С помощью выражения CASE для каждого служащего определите должность (JOB) и возвратите 1 или 0, чтобы обозначить ее. Потребуется написать выражение CASE и, таким образом, создать столбец для каждой из возможных должностей: 1 select ename, 2 case when job = CLERK 3 then 1 else 0 4 end as is clerk, 5 case when job = SALESMAN 6 then 1 else 0 7 end as is sales, 8 case when job = MANAGER 9 then 1 else 0 10 end as is mgr, 11 case when job = ANALYST 12 then 1 else 0 13 end as is analyst, 14 case when job = PRESIDENT 15 then 1 else 0 16 end as is prez 17 from emp 18 order by 2,3,4,5,6 Обсуждение Код данного решения практически не требует пояснений. Если возникли трудности с его пониманием, просто добавьте в оператор SELECT столбец JOB: select ename, job, case when job = CLERK then 1 else 0 end as is clerk, case when job = SALESMAN then 1 else 0 end as is sales, case when job = MANAGER then 1 else 0 end as is mgr, case when job = ANALYST then 1 else 0 end as is analyst, case when job = PRESIDENT then 1 else 0 end as is prez
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |