Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Групповые функции Oracle  [new]
Natali_ya20
Member

Откуда:
Сообщений: 2
Помогите, пожалуйста, с задачкой.
Вообщем-то, я ее решила, но не так как требует условие(пробовала решить с использованием rollap,cube,grouping sets,но все равно не получается..)
Задача:
Напишите одним запросом без использования операторов Union, который для «tab1» посчитает суммы по полям «a1» и «a2», в группировке по полям «TXT», «CODE», при этом для поля «TXT» требуется рассчитать только итоговые значения суммы «a1», а для поля «CODE» требуется рассчитать только итоговые значения суммы «a2», общий итог по группам не требуется.
Результат должен быть похож на:
TEXT SUM_A1 SUM_A2
----------------- ---------- ----------
Txt1 – 0 2 1
Txt2 – 0 4 4
Txt1 – 1 1 2
Txt2 – 1 5 3
Txt1 – 2 3 7
Txt2 – 2 6 1
Итог code: 0 0 5
Итог code: 1 0 5
Итог code: 2 0 8
Итог txt: Txt1 6 0
Итог txt: Txt2 15 0


TABLE tab1
Name Type
------ ------------
ID NUMBER
TXT CHAR(3)
CODE NUMBER(3)
A1 NUMBER
A2 NUMBER


Мое решение с использованием union:
SELECT TXT,CODE, SUM(A1) as sum_a1,SUM(A2) as sum_a2
FROM FNI_TAB1
GROUP BY TXT, CODE
union ALL
SELECT TXT,NULL,SUM(A1) as sum_a1,NULL
FROM FNI_TAB1
GROUP BY TXT
union ALL
SELECT NULL,CODE,NULL,SUM(A2) as sum_a2
FROM FNI_TAB1
GROUP BY CODE;

Заранее спасибо.
13 мар 20, 17:19    [22098720]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции Oracle  [new]
PuM256
Member

Откуда:
Сообщений: 21
Natali_ya20,

SQL> With t As
  2  (
  3    Select 1 Id, 'Txt1' TXT, 0 Code, 10 A1, 20 A2 From dual
  4    Union All Select 2, 'Txt1', 1, 20, 30 From dual
  5    Union All Select 3, 'Txt2', 2, 30, 40 From dual
  6    Union All Select 3, 'Txt2', 0, 40, 60 From dual
  7  )
  8  Select
  9    txt, Code,
 10    Decode(Grouping_id, 2, Null, SUM_A1) SUM_A1,
 11    Decode(Grouping_id, 1, Null, SUM_A2) SUM_A2
 12  From (
 13    Select txt, Code, Sum(a1) sum_a1, Sum(a2) sum_a2, grouping_id(txt, Code) grouping_id
 14    From t
 15  	Group By Grouping Sets((txt, Code), txt, Code) Order By 5, 1, 2);

TXT                    CODE SUM_A1                                   SUM_A2
---------------- ---------- ---------------------------------------- ----------------------------------------
Txt1                      0 10                                       20
Txt1                      1 20                                       30
Txt2                      0 40                                       60
Txt2                      2 30                                       40
Txt1                        30                                       
Txt2                        70                                       
                          0                                          80
                          1                                          30
                          2                                          40

9 rows selected
13 мар 20, 18:02    [22098765]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции Oracle  [new]
PuM256
Member

Откуда:
Сообщений: 21
Natali_ya20,

Или если хочется странного, можно так:

SQL> With t As
  2  (
  3    Select 1 Id, 'Txt1' TXT, 0 Code, 10 A1, 20 A2 From dual
  4    Union All Select 2, 'Txt1', 1, 20, 30 From dual
  5    Union All Select 3, 'Txt2', 2, 30, 40 From dual
  6    Union All Select 3, 'Txt2', 0, 40, 60 From dual
  7  )
  8  Select
  9    txt, Code,
 10    Decode(Grouping_id, 2, Null, SUM_A1) SUM_A1,
 11    Decode(Grouping_id, 1, Null, SUM_A2) SUM_A2
 12  From (
 13    Select txt, Code, Sum(a1) sum_a1, Sum(a2) sum_a2, grouping_id(txt, Code) grouping_id
 14    From t
 15  	Group By Grouping Sets((txt, Code), txt, Code) Order By 5, 1, 2);

TXT                    CODE SUM_A1                                   SUM_A2
---------------- ---------- ---------------------------------------- ----------------------------------------
Txt1                      0 10                                       20
Txt1                      1 20                                       30
Txt2                      0 40                                       60
Txt2                      2 30                                       40
Txt1                        30                                       
Txt2                        70                                       
                          0                                          80
                          1                                          30
                          2                                          40

9 rows selected
13 мар 20, 18:54    [22098793]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции Oracle  [new]
PuM256
Member

Откуда:
Сообщений: 21
Сорри, одно и то же дважны скопировал. :)

SQL> With t As
  2  (
  3  	Select 1 Id, 'Txt1' TXT, 0 Code, 10 A1, 20 A2 From dual
  4    Union All Select 2, 'Txt1', 1, 20, 30 From dual
  5    Union All Select 3, 'Txt2', 2, 30, 40 From dual
  6    Union All Select 3, 'Txt2', 0, 40, 60 From dual
  7  )
  8  Select txt, Code, sum_a1, sum_a2 From t
  9  Model
 10  Dimension By (txt, Code)
 11  Measures (a1, a2, 0 sum_a1, 0 sum_a2)
 12  Rules Upsert All (
 13  	sum_a1[Any, Any] = Sum(a1)[Cv(txt), Cv(Code)],
 14  	sum_a2[Any, Any] = Sum(a2)[Cv(txt), Cv(Code)],
 15    sum_a1[txt, Null] = Sum(a1)[Cv(txt), Any],
 16    sum_a2[Null, Code] = Sum(a2)[Any, Cv(Code)]
 17  );

TXT                    CODE     SUM_A1     SUM_A2
---------------- ---------- ---------- ----------
Txt1                      0         10         20
Txt1                      1         20         30
Txt2                      2         30         40
Txt2                      0         40         60
Txt1                                30 
Txt2                                70 
                          0                    80
                          1                    30
                          2                    40

9 rows selected
13 мар 20, 23:07    [22098919]     Ответить | Цитировать Сообщить модератору
 Re: Групповые функции Oracle  [new]
Natali_ya20
Member

Откуда:
Сообщений: 2
PuM256,большое спасибо!Разобралась:)
23 мар 20, 16:23    [22104588]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить