Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Group с пересечением / 25 сообщений из 27, страница 1 из 2
18.05.2017, 11:26
    #39455246
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
В таблице имеется поле category
Код: plsql
1.
2.
3.
Category A
Category B
Category C



Делаю группировку

Код: plsql
1.
2.
3.
4.
Category A 10
Category B 20
Category C 30
Other        50



Хочу получить на выходе вот такую структуру
Код: plsql
1.
2.
3.
4.
5.
6.
Category A 10
Category B 20
Category C 30
Other        50
Category A + Category B + Other 80 (тут могу разные пересечения)
Category A + Category B + Category C + Other 110 (тут все)
...
Рейтинг: 0 / 0
18.05.2017, 11:29
    #39455249
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
-=Koba=-,

grouping sets, rollup
...
Рейтинг: 0 / 0
18.05.2017, 11:43
    #39455259
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
env-=Koba=-,

grouping sets, rollup
Спасибо за направление
...
Рейтинг: 0 / 0
18.05.2017, 12:30
    #39455330
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
Сгруппировал по периодам даты
Реально ли перевернуть колонку paltform и сделать ее колонками
Число их может меняться но максимально из выше сказанного условия будет 6
...
Рейтинг: 0 / 0
18.05.2017, 12:39
    #39455337
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
-=Koba=-,

pivot
...
Рейтинг: 0 / 0
18.05.2017, 13:51
    #39455388
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
-=Koba=-,
не проще ли select ...,count(distinct user_id) ...?

.....
stax
...
Рейтинг: 0 / 0
18.05.2017, 14:05
    #39455405
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
stax..-=Koba=-,
не проще ли select ...,count(distinct user_id) ...?

.....
stax

Не совсем понял
...
Рейтинг: 0 / 0
18.05.2017, 14:10
    #39455408
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
-=Koba=-stax..-=Koba=-,
не проще ли select ...,count(distinct user_id) ...?

.....
stax

Не совсем понял
убрать подзапрос
вместо "select distinct..." count(distinct

.....
stax
...
Рейтинг: 0 / 0
18.05.2017, 16:48
    #39455536
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
stax..-=Koba=-пропущено...


Не совсем понял
убрать подзапрос
вместо "select distinct..." count(distinct

.....
stax

спасибо за подсказку
...
Рейтинг: 0 / 0
18.05.2017, 19:34
    #39455638
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
-=Koba=-stax..пропущено...

убрать подзапрос
вместо "select distinct..." count(distinct

.....
stax

спасибо за подсказку

Ну тут от условия над плясать
Код: plsql
1.
2.
3.
4.
5.
6.
7.
select to_char(operation, 'YYYY-MM'), platform, count(*)
   from( select distinct platform, user_id, trunc(operation_time) as operation
            from Auth_Info
          .........
          )
group by to_char(operation, 'YYYY-MM'), platform
order by 1


этот селект вернет сколько "дней"разные пользователи были в системе
т.е. если пользователь "A" заходил каждый день в январе то count(*) = 31

для варианта
Код: plsql
1.
2.
3.
4.
5.
select to_char(operation_time, 'YYYY-MM'), platform, count(distinct user_id)
            from Auth_Info
          .........
group by to_char(operation, 'YYYY-MM'), platform
order by 1


условие уже сколько пользователей ХОТЯ-БЫ раз в этом месяце заходили в систему
т.е. если пользователь "A" заходил каждый день в январе то count(distinct user_id) = 1

Т.е. оба варианта рабочие но считают/выводят разные данные и тут все от условия задачи зависит ...
...
Рейтинг: 0 / 0
19.05.2017, 10:14
    #39455867
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
Еще вопрос а можно ли использовать условия в группировке

Например мне надо посчитать число
удовлетворяющих как пример

Код: plsql
1.
2.
3.
(A || B) && С - вывод 2 - Num присутствует в категории A или B и обязательно в С
(A || B) && !С - вывод 0 - Num присутствует в категории A или B и обязательно нет  в С
(A || B) || С - вывод 3 - Num присутствует в категории A или B или С
...
Рейтинг: 0 / 0
19.05.2017, 10:29
    #39455888
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
Вот сейчас непонятно было что Вам надо:

-=Koba=-Еще вопрос а можно ли использовать условия в группировке


Ответ: можно


-=Koba=-Например мне надо посчитать число
удовлетворяющих как пример

Код: plsql
1.
2.
3.
(A || B) && С - вывод 2 - Num присутствует в категории A или B и обязательно в С
(A || B) && !С - вывод 0 - Num присутствует в категории A или B и обязательно нет  в С
(A || B) || С - вывод 3 - Num присутствует в категории A или B или С




Не понял

Если надо посчитать число 3 разных колонки - тогда
Код: plsql
1.
2.
3.
count( case when (A or B) and C then 1 end) as F1,
count( case when (A or B) and not C then 1 end) as F2,
count( case when A or B or C then 1 end) as F3



Если это 1 поле с константным выводом
Код: plsql
1.
2.
3.
4.
case when (A or B) and C then 2
       when (A or B) and not C then 0
       when A or B or C then 3
end as F1
...
Рейтинг: 0 / 0
19.05.2017, 14:24
    #39456154
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
MaximaXXLВот сейчас непонятно было что Вам надо:

-=Koba=-Еще вопрос а можно ли использовать условия в группировке


Ответ: можно


-=Koba=-Например мне надо посчитать число
удовлетворяющих как пример

Код: plsql
1.
2.
3.
(A || B) && С - вывод 2 - Num присутствует в категории A или B и обязательно в С
(A || B) && !С - вывод 0 - Num присутствует в категории A или B и обязательно нет  в С
(A || B) || С - вывод 3 - Num присутствует в категории A или B или С




Не понял

Если надо посчитать число 3 разных колонки - тогда
Код: plsql
1.
2.
3.
count( case when (A or B) and C then 1 end) as F1,
count( case when (A or B) and not C then 1 end) as F2,
count( case when A or B or C then 1 end) as F3



Если это 1 поле с константным выводом
Код: plsql
1.
2.
3.
4.
case when (A or B) and C then 2
       when (A or B) and not C then 0
       when A or B or C then 3
end as F1



Нет это не константа, а количество таких совпадение
(A || B) && С удовлетворяет num=1 и num=2 от сюда count - 2
...
Рейтинг: 0 / 0
19.05.2017, 15:53
    #39456266
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
-=Koba=-
Нет это не константа, а количество таких совпадение
(A || B) && С удовлетворяет num=1 и num=2 от сюда count - 2

Я не понимаю что надо группировать с чем ...

т.е. что надо, группировку для одной даты? для одного NUM ... что должно удовлетворять ((CAT = 'A' or CAT = 'B') and CAT = 'C')?


Напиши плиз для
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t1 as(
select to_date('01.05.2017','dd.mm.yyyy') Dat, 'A' Cat, 1 Num from dual union all
select to_date('01.05.2017','dd.mm.yyyy') Dat, 'A' Cat, 1 Num from dual union all
select to_date('01.05.2017','dd.mm.yyyy') Dat, 'A' Cat, 2 Num from dual union all
select to_date('01.05.2017','dd.mm.yyyy') Dat, 'B' Cat, 1 Num from dual union all
select to_date('02.05.2017','dd.mm.yyyy') Dat, 'C' Cat, 1 Num from dual union all
select to_date('02.05.2017','dd.mm.yyyy') Dat, 'C' Cat, 2 Num from dual union all
select to_date('02.05.2017','dd.mm.yyyy') Dat, 'C' Cat, 3 Num from dual union all
select to_date('01.04.2017','dd.mm.yyyy') Dat, 'A' Cat, 1 Num from dual )



какой результат ты хочешь увидеть для этой таблицы?
...
Рейтинг: 0 / 0
22.05.2017, 15:11
    #39457421
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
MaximaXXL,

Я хочу узнать число num? которые удовлетворяют условию

(A || B) && С

num = 1 - удовлетворяет, присутствует в A, присутствует в B и присутствует в C
num = 2 - удовлетворяет, присутствует в A и присутствует в C
num = 3 - не удовлетворяет, присутствует в C только (выражение (A || B) && С - ложно )

Итого для num in (1..3) два удовлетворения

В итоговой таблице вывести что-то вроде

Код: plsql
1.
2.
COL             _|_ Count
(A || B) && С _|_ 2
...
Рейтинг: 0 / 0
22.05.2017, 15:58
    #39457498
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
-=Koba=-,

Как частный случай могу предложить такой например

Код: plsql
1.
2.
3.
4.
5.
6.
select Count( distinct
        case listagg(Cat) within group (ORDER BY Cat) when 'BC' then Num
      end) Cnt
from 
(select distinct Decode(Cat,'A','B',Cat) Cat, Num from t1)
group by Num
...
Рейтинг: 0 / 0
22.05.2017, 16:22
    #39457524
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
MaximaXXL-=Koba=-,

Как частный случай могу предложить такой например

Код: plsql
1.
2.
3.
4.
5.
6.
select Count( distinct
        case listagg(Cat) within group (ORDER BY Cat) when 'BC' then Num
      end) Cnt
from 
(select distinct Decode(Cat,'A','B',Cat) Cat, Num from t1)
group by Num



И остальные условия объединть через unio получается?
...
Рейтинг: 0 / 0
22.05.2017, 16:38
    #39457539
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
[quot -=Koba=-]MaximaXXL-=Koba=-,


И остальные условия объединть через unio получается?

Да сложно понять что тебе надо =)

можно так например

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select la, Count(Distinct Num) cnt
from(
select case listagg(Cat_) within group (ORDER BY Cat_) when 'BC' then '(A||B)C'
                                                     when 'B' then '(A||B)!C'
                                                     when 'C' then '(A||B)||C'
                                                     end la
,Num
from 
(select distinct Decode(Cat,'A','B',Cat) Cat_, Num from t1)
group by Num)
group by la
...
Рейтинг: 0 / 0
22.05.2017, 16:43
    #39457544
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
MaximaXXL,

Да спасибо, объяснять не мой конек =((
буду смотреть твои примеры... спасибо за напралвение
...
Рейтинг: 0 / 0
26.05.2017, 14:42
    #39460469
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
А как можно группировать с учетом предыдущих данных??

То есть ест таблица пользователей

Код: plsql
1.
ID DATE_CR



Группирую по месяцам
Код: plsql
1.
SELECT ... GROUP BY TO_CHAR (operation_time, 'YYYY-MM')




А я еще хочу учитывать предыдущие месяцы

У меня так, число зарегиных по месяца
Код: plsql
1.
2.
3.
Январь 10
Февраль 3
Март 5



Хочу получить
Код: plsql
1.
2.
3.
Январь 10
Февраль 13
Март 18
...
Рейтинг: 0 / 0
26.05.2017, 16:35
    #39460566
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
-=Koba=-,

sum() over(parititon by .. order by.. rows/range between ..)
...
Рейтинг: 0 / 0
29.05.2017, 14:51
    #39461622
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
Можно ли избавиться от внешнего sql select
Код: plsql
1.
2.
3.
4.
5.
SELECT operation, SUM (userCount) OVER (ORDER BY operation)
  FROM (SELECT *
		  FROM (  SELECT TO_CHAR (created, 'YYYY-MM') AS operation, COUNT (DISTINCT id) AS userCount
					FROM users
				GROUP BY TO_CHAR (created, 'YYYY-MM')))




Чтоб считал сразу count и суммировал с предыдущей строчкой
...
Рейтинг: 0 / 0
29.05.2017, 15:11
    #39461643
stax..
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
-=Koba=-,
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> select t.*,
  2  sum(j) over (order by deptno) jj
  3   from (
  4  select deptno,count(distinct job) j from emp group by deptno) t
  5  /

    DEPTNO          J         JJ
---------- ---------- ----------
        10          3          3
        20          3          6
        30          3          9

SQL> select deptno,count(distinct job) j
  2  ,sum(count(distinct job)) over (order by deptno) jj
  3  from emp group by deptno
  4  /

    DEPTNO          J         JJ
---------- ---------- ----------
        10          3          3
        20          3          6
        30          3          9




.....
stax
...
Рейтинг: 0 / 0
29.05.2017, 15:15
    #39461647
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
stax..,

Спасибо за помощь
...
Рейтинг: 0 / 0
29.05.2017, 15:17
    #39461649
dbms_photoshop
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Group с пересечением
-=Koba=-,

Когда ты впервые понял, что ты боишься "внешних sql select"?
Можешь ли вспомнить что послужило причиной?
Здесь могут помочь побороть иррациональные страхи.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Group с пересечением / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]