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

Откуда:
Сообщений: 182
Добрый день!

Подскажите, плиз, как переписать запрос чтоб избавится от union подзапросов?

with t as 
(
SELECT 'Male' as sex , '  Kolya' as name , 12 as age FROM dual
  union all
SELECT '  Male' as sex , 'Vasya' as name , 18 as age FROM dual
  union all
SELECT 'Female' as sex , 'Inna   ' as name , 33 as age FROM dual
  union all
SELECT 'Female ' as sex , 'Olga' as name , 21 as age FROM dual
)

SELECT DISTINCT * FROM (
select 
trim(sex) as sex_name
, null as age
 FROM t
union all
select 
trim(name) as sex_name
, age as age
 FROM t )
 
 ORDER BY 1 , 2 nulls first


Результат устраивает, но если нужно больше схлопывать, то как-то неудобно.

Подтолкните куда-то .. Может оконные функции?

Спасибо за понимание и сори за мое непонимаение)))
8 май 15, 11:25    [17617001]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
123йй
Member

Откуда:
Сообщений: 1638
Moss
Результат устраивает

SQL>
SEX_NAME AGE
-------- ----------
Female
Inna 33
Kolya 12

Male
Olga 21
Vasya 18
6 rows selected
8 май 15, 11:32    [17617062]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Elic
Member

Откуда:
Сообщений: 29991
Moss
за мое непонимаение
Бессмысленно избавляться от бессмыслицы в бессмысленном запросе.
8 май 15, 11:35    [17617086]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Moss
Member

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

точно лажа, сори
8 май 15, 11:40    [17617120]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Боже мой пятница...
Guest
Moss
Добрый день!
Может оконные функции?


Ты путаешь теплое мягким. Пол человека мешаешь с именем человека. Тем самым открываешь невидомые доселе пОлы: Коля, Оля, Вася.

Осталось возраст скрестить с именем. И тогда у каждого человека каждый год будет новое имя. Тебя как зовут? 44.
8 май 15, 11:43    [17617132]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Moss
Member

Откуда:
Сообщений: 182
with t as 
(
SELECT   'Male' as sex , '  Kolya' as name , 12 as age FROM dual
  union all
SELECT  '  Male' as sex , 'Vasya' as name , 18 as age FROM dual
  union all
SELECT  'Female' as sex , 'Inna   ' as name , 33 as age FROM dual
  union all
SELECT  'Female ' as sex , 'Olga' as name , 21 as age FROM dual
)

SELECT sex_name, age FROM (
SELECT DISTINCT * FROM (
select 
trim(sex) as sex_name
, null as age
, trim(sex)
 FROM t
union all
select 
trim(name) as sex_name
, age as age
, trim(sex)
 FROM t )
 
 ORDER BY 3 , 2 nulls first
 )
8 май 15, 11:46    [17617149]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Moss
Member

Откуда:
Сообщений: 182
Elic
Moss
за мое непонимаение
Бессмысленно избавляться от бессмыслицы в бессмысленном запросе.


это точно ))))))))))))
8 май 15, 11:48    [17617158]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Moss
Member

Откуда:
Сообщений: 182
[quot

Ты путаешь теплое мягким. Пол человека мешаешь с именем человека. Тем самым открываешь невидомые доселе пОлы: Коля, Оля, Вася.

Осталось возраст скрестить с именем. И тогда у каждого человека каждый год будет новое имя. Тебя как зовут? 44.[/quot]

Это не я такой. Такая задача.
В одной колонке написано :
Пол / Имя


Можно конечно отобрать одним запросом Ж , вторым М , но суть не меняется..
8 май 15, 11:51    [17617178]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Moss
Member

Откуда:
Сообщений: 182

Ты путаешь теплое мягким. Пол человека мешаешь с именем человека. Тем самым открываешь невидомые доселе пОлы: Коля, Оля, Вася.

Осталось возраст скрестить с именем. И тогда у каждого человека каждый год будет новое имя. Тебя как зовут? 44.


Это не я такой. Такая задача.
В одной колонке написано :
Пол / Имя



Можно конечно отобрать одним запросом Ж , вторым М , но суть не меняется..
8 май 15, 11:53    [17617190]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Elic
Member

Откуда:
Сообщений: 29991
RTFM GROUPING SETS
+
group by grouping sets ((trim(sex)), (trim(sex), trim(name), age))
8 май 15, 11:54    [17617197]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
break on
Guest
Moss
Такая задача.
Это обычные итоги, лучше решать средствами клиентских инструментов.
8 май 15, 11:57    [17617226]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Moss
Member

Откуда:
Сообщений: 182
break on
Moss
Такая задача.
Это обычные итоги, лучше решать средствами клиентских инструментов.


Ну не умеет человек делать сводную табл. с экселе(
8 май 15, 11:59    [17617242]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Осел, козел, мартышка и косолапы
Guest
Moss
break on
пропущено...
Это обычные итоги, лучше решать средствами клиентских инструментов.


Ну не умеет человек делать сводную табл. с экселе(
а в sql ты усеешь?
8 май 15, 12:01    [17617258]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Moss
Member

Откуда:
Сообщений: 182
Осел, козел, мартышка и косолапы
Moss
пропущено...


Ну не умеет человек делать сводную табл. с экселе(
а в sql ты усеешь?


Не очень, но хочу.
8 май 15, 12:07    [17617298]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Чехов Антон Палыч
Guest
Moss
Осел, козел, мартышка и косолапы
пропущено...
а в sql ты усеешь?


Не очень, но хочу.

Желания должны совпадать с возможностями. Иначе возможности заменят ваши желания на свои.
8 май 15, 12:29    [17617434]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Moss
Member

Откуда:
Сообщений: 182
Elic
RTFM GROUPING SETS
+
group by grouping sets ((trim(sex)), (trim(sex), trim(name), age))


Спасибо огромное !!!!

Сделал так:

with t as 
(
SELECT   'Male' as sex , '  Kolya' as name , 12 as age FROM dual
  union all
SELECT  '  Male' as sex , 'Vasya' as name , 18 as age FROM dual
  union all
SELECT  '  Male' as sex , 'Roma' as name , 18 as age FROM dual
  union all
SELECT  'Female' as sex , 'Inna   ' as name , 33 as age FROM dual
  union all
SELECT  'Female ' as sex , 'Olga' as name , 21 as age FROM dual
)

SELECT  
  case when trim(name) is null and trim(sex)='Female' then to_char('Итого по ')||trim(sex)
     when trim(name) is null and trim(sex)='Male' then to_char('Итого по ')||trim(sex)
     when trim(name) is null and trim(sex) is null then to_char('Итого по всем ') else  trim(name) end as sex_name
  , age
  , case when trim(name) is null and trim(sex)='Female' then COUNT(name)
         when trim(name) is null and trim(sex)='Male' then COUNT(name)
         when trim(name) is null and trim(sex) is null then COUNT(name) end as kol
FROM t
  group by grouping sets((trim(sex)), (trim(sex), trim(name), age),())
 ORDER BY trim(sex), age nulls first
8 май 15, 12:43    [17617525]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Moss,

А теперь стоит прочитать про GROUPING, чтобы не перечислять варианты в CASE.
8 май 15, 14:43    [17618269]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
stax..
Guest
Moss,

для case/decode гляньте на ф-ции grouping/grouping_id
напр
  1  with t as
  2  (
  3  SELECT   'Male' as sex , '  Kolya' as name , 12 as age FROM dual
  4    union all
  5  SELECT  '  Male' as sex , 'Vasya' as name , 18 as age FROM dual
  6    union all
  7  SELECT  '  Male' as sex , 'Roma' as name , 18 as age FROM dual
  8    union all
  9  SELECT  'Female' as sex , 'Inna   ' as name , 33 as age FROM dual
 10    union all
 11  SELECT  'Female ' as sex , 'Olga' as name , 21 as age FROM dual
 12  )
 13  SELECT
 14    case when trim(name) is null and trim(sex)='Female' then to_char('Итого по ')||trim(sex)
 15       when trim(name) is null and trim(sex)='Male' then to_char('Итого по ')||trim(sex)
 16       when trim(name) is null and trim(sex) is null then to_char('Итого по всем ') else  trim(name) end as sex_name
 17    , age
 18    , case when trim(name) is null and trim(sex)='Female' then COUNT(name)
 19           when trim(name) is null and trim(sex)='Male' then COUNT(name)
 20           when trim(name) is null and trim(sex) is null then COUNT(name) end as kol
 21  ,GROUPING(trim(sex)) g1
 22  ,GROUPING(trim(name)) g2
 23  ,GROUPING_id(trim(sex), trim(name), age) i1
 24  FROM t
 25    group by grouping sets((trim(sex)), (trim(sex), trim(name), age),())
 26*  ORDER BY trim(sex), age nulls first
SQL> /

SEX_NAME                AGE        KOL         G1         G2         I1
---------------- ---------- ---------- ---------- ---------- ----------
Итого по Female                      2          0          1          3
Olga                     21                     0          0          0
Inna                     33                     0          0          0
Итого по Male                        3          0          1          3
Kolya                    12                     0          0          0
Vasya                    18                     0          0          0
Roma                     18                     0          0          0
Итого по всем                        5          1          1          7

8 rows selected.

SQL>


......
stax
8 май 15, 15:08    [17618445]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Moss
Member

Откуда:
Сообщений: 182
suPPLer
Moss,

А теперь стоит прочитать про GROUPING, чтобы не перечислять варианты в CASE.


Оооо, спасибо!

Если я правильно все понял , то как-то так:

with t as 
(
SELECT   'Male' as sex , '  Kolya' as name , 12 as age FROM dual
  union all
SELECT  '  Male' as sex , 'Vasya' as name , 18 as age FROM dual
  union all
SELECT  '  Male' as sex , 'Roma' as name , 18 as age FROM dual
  union all
SELECT  'Female' as sex , 'Inna   ' as name , 33 as age FROM dual
  union all
SELECT  'Female ' as sex , 'Olga' as name , 21 as age FROM dual
)

SELECT  
    decode(grouping(trim(name)), 1, to_char('Итого по ')||nvl(trim(sex),'всем'), trim(name)) AS sex_name
  , age
  , decode(grouping(trim(name)), 1, COUNT(trim(name)), null) AS KOL
FROM t
  group by grouping sets((trim(sex)), (trim(sex), trim(name), age),())
 ORDER BY trim(sex), age nulls first
 
 
 
8 май 15, 15:24    [17618581]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
еще не означает...
Guest
Moss
Такая задача.
В одной колонке написано :
Пол / Имя
sex||' / '||name as "Пол / Имя"
8 май 15, 15:31    [17618624]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
j2k
Member

Откуда: Новосибирск
Сообщений: 550
Moss
Это не я такой. Такая задача.
В одной колонке написано :
Пол / Имя


Потом окажется что бизнесу нужно было в этой колонке, что-то вроде

Пол / Имя
Kolya M
Vasya M
Inna F
Olga F

:)
8 май 15, 15:32    [17618635]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Скорее вот так
Guest
j2k
Пол / Имя
Kolya / M
Vasya / M
Inna / F
Olga / F

:)
8 май 15, 15:34    [17618640]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Чехов Антон Палыч
Guest
еще не означает...
Moss
Такая задача.
В одной колонке написано :
Пол / Имя
sex||' / '||name as "Пол / Имя"


Это с большей вероятностью то что требуется. Хотя вообще всё это очень странно. просто должна быть колонка где определяется мужик или баба, али трангендер Коля.
8 май 15, 15:35    [17618645]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
Чехов Антон Палыч
Guest
j2k
Moss
Это не я такой. Такая задача.
В одной колонке написано :
Пол / Имя


Потом окажется что бизнесу нужно было в этой колонке, что-то вроде

Пол / Имя
Kolya M
Vasya M
Inna F
Olga F

:)


Вообще бизнесу должно быть безразлично. А иначе дискриминацией попахивает.
8 май 15, 15:38    [17618660]     Ответить | Цитировать Сообщить модератору
 Re: переписать запрос без union  [new]
j2k
Member

Откуда: Новосибирск
Сообщений: 550
Чехов Антон Палыч
Вообще бизнесу должно быть безразлично. А иначе дискриминацией попахивает.

ага, пофиг кого поздравлять с 8 марта, а кого с 23 февраля :)
8 май 15, 15:49    [17618730]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить