Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросом / 21 сообщений из 21, страница 1 из 1
18.11.2018, 23:21
    #39734877
leonidktoto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Помогите пожалуйста с запросом.
Имеются данные:
Имя Товар
Вася Груша
Вася Апельсин
Вася Груша
Вася Груша
Вася Яблоко
Петя Апельсин
Дима Груша
Дима Яблоко
Дима Апельсин
Коля Груша
Коля Груша

Нужно развернуть столбец и получить:
Имя Груша Апельсин Яблоко
Вася 3 1 1
Дима 1 1 1
Коля 2 0 0
Петя 0 1 0
...
Рейтинг: 0 / 0
19.11.2018, 05:19
    #39734903
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
...
Рейтинг: 0 / 0
19.11.2018, 07:51
    #39734925
leonidktoto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
dmdmdm Развернуть столбец в строку .

Красавица выручила.
...
Рейтинг: 0 / 0
19.11.2018, 08:00
    #39734927
leonidktoto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT TABLE1.NAME,
COUNT (CASE WHEN TABLE1.TOVAR='Груша' THEN TABLE1.NAME END) as "Груша",
COUNT (CASE WHEN TABLE1.TOVAR='Апельсин' THEN TABLE1.NAME END) as "Апельсин",
COUNT (CASE WHEN TABLE1.TOVAR='Яблоко' THEN TABLE1.NAME END) as "Яблоко"
FROM TABLE1
GROUP BY TABLE1.NAME
ORDER BY 
COUNT (CASE WHEN TABLE1.TOVAR='Груша' THEN TABLE1.NAME END) DESC,
COUNT (CASE WHEN TABLE1.TOVAR='Апельсин' THEN TABLE1.NAME END) as "Апельсин" DESC,
COUNT (CASE WHEN TABLE1.TOVAR='Яблоко' THEN TABLE1.NAME END) as "Яблоко" DESC



результат:

Имя Груша Апельсин Яблоко
Вася 3 1 1
Коля 2 0 0
Дима 1 1 1
Петя 0 1 0

Развернуть получается, нужно правильно отсортировать.
...
Рейтинг: 0 / 0
19.11.2018, 08:46
    #39734936
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
leonidktoto,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with q(name,prod) as (
select 'Вася', 'Груша' from dual union all
select 'Вася', 'Апельсин' from dual union all
select 'Вася', 'Груша' from dual union all
select 'Вася', 'Груша' from dual union all
select 'Вася', 'Яблоко' from dual union all
select 'Петя', 'Апельсин' from dual union all
select 'Дима', 'Груша'  from dual union all
select 'Дима', 'Яблоко' from dual union all
select 'Дима', 'Апельсин' from dual union all
select 'Коля', 'Груша' from dual union all
select 'Коля', 'Груша' from dual )

select name
, sum(decode(prod,'Груша',1,0)) as "Груша"
, sum(decode(prod,'Апельсин',1,0)) as "Апельсин"
, sum(decode(prod,'Яблоко',1,0)) as "Яблоко"
 from q
group by name
order by  
  sum(decode(prod,'Груша',1,0))
+ sum(decode(prod,'Апельсин',1,0))
+ sum(decode(prod,'Яблоко',1,0)) desc
...
Рейтинг: 0 / 0
19.11.2018, 10:03
    #39734968
leonidktoto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Dshedooleonidktoto,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with q(name,prod) as (
select 'Вася', 'Груша' from dual union all
select 'Вася', 'Апельсин' from dual union all
select 'Вася', 'Груша' from dual union all
select 'Вася', 'Груша' from dual union all
select 'Вася', 'Яблоко' from dual union all
select 'Петя', 'Апельсин' from dual union all
select 'Дима', 'Груша'  from dual union all
select 'Дима', 'Яблоко' from dual union all
select 'Дима', 'Апельсин' from dual union all
select 'Коля', 'Груша' from dual union all
select 'Коля', 'Груша' from dual )

select name
, sum(decode(prod,'Груша',1,0)) as "Груша"
, sum(decode(prod,'Апельсин',1,0)) as "Апельсин"
, sum(decode(prod,'Яблоко',1,0)) as "Яблоко"
 from q
group by name
order by  
  sum(decode(prod,'Груша',1,0))
+ sum(decode(prod,'Апельсин',1,0))
+ sum(decode(prod,'Яблоко',1,0)) desc



Так может и работает но дело в том что в столбце name может быть больше 5000 уникальных имен, а в столбце товар может быть до 10 значений. То есть перечислить в запросе все 5000 имен не получится.
...
Рейтинг: 0 / 0
19.11.2018, 10:13
    #39734978
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
leonidktotoперечислить в запросе все 5000 имен не получится.Попроси на форуме. помогут набрать хоть 10 тысяч имен.
...
Рейтинг: 0 / 0
19.11.2018, 10:19
    #39734982
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
leonidktotoDshedooleonidktoto,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with q(name,prod) as (
select 'Вася', 'Груша' from dual union all
select 'Вася', 'Апельсин' from dual union all
select 'Вася', 'Груша' from dual union all
select 'Вася', 'Груша' from dual union all
select 'Вася', 'Яблоко' from dual union all
select 'Петя', 'Апельсин' from dual union all
select 'Дима', 'Груша'  from dual union all
select 'Дима', 'Яблоко' from dual union all
select 'Дима', 'Апельсин' from dual union all
select 'Коля', 'Груша' from dual union all
select 'Коля', 'Груша' from dual )

select name
, sum(decode(prod,'Груша',1,0)) as "Груша"
, sum(decode(prod,'Апельсин',1,0)) as "Апельсин"
, sum(decode(prod,'Яблоко',1,0)) as "Яблоко"
 from q
group by name
order by  
  sum(decode(prod,'Груша',1,0))
+ sum(decode(prod,'Апельсин',1,0))
+ sum(decode(prod,'Яблоко',1,0)) desc




Так может и работает но дело в том что в столбце name может быть больше 5000 уникальных имен, а в столбце товар может быть до 10 значений. То есть перечислить в запросе все 5000 имен не получится.

в столбце товар может быть до 10 значений - они всегда одни и те же? или для каждого Васи свой набор апельсинов и бочек
...
Рейтинг: 0 / 0
19.11.2018, 12:35
    #39735093
EvgeniaMakarova
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
leonidktoto,

вот ,прямо Ваш пример

https://www.techonthenet.com/oracle/pivot.php
...
Рейтинг: 0 / 0
19.11.2018, 12:51
    #39735103
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
leonidktotoТак может и работает но дело в том что в столбце name может быть больше 5000 уникальных имен, а в столбце товар может быть до 10 значений. То есть перечислить в запросе все 5000 имен не получится.

0) очет форміровать на клиенте (шахматка)
1) строить селект динамически
2) прономеровать фрукты и выводить в виде name, tovar1, tovar2 ... tovar10, tovar_other
3) хмл

.....
stax
...
Рейтинг: 0 / 0
19.11.2018, 13:21
    #39735115
andreymx
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Stax2) пронумеровать фрукты и выводить в виде name, tovar1, tovar2 ... tovar10, tovar_other
.....
stax

пронумеровать фрукты и выводить в виде
name,
tovar1, tovar2 ... tovar10, tovar_other,
tovar_name_1, tovar_name_2 ... tovar_name_10, tovar__name_other,
...
Рейтинг: 0 / 0
19.11.2018, 13:48
    #39735127
merch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Как правильно подметил Stax, куда проще это реализовать с помощью какого-нибудь средства построения отчетов.

На примере SSRS.


Готовим запрос.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
with src(user_name, prod_name) as
(
  select 'Вася', 'Груша'    from dual union all
  select 'Вася', 'Апельсин' from dual union all
  select 'Вася', 'Груша'    from dual union all
  select 'Вася', 'Груша'    from dual union all
  select 'Вася', 'Яблоко'   from dual union all
  select 'Петя', 'Апельсин' from dual union all
  select 'Дима', 'Груша'    from dual union all
  select 'Дима', 'Яблоко'   from dual union all
  select 'Дима', 'Апельсин' from dual union all
  select 'Коля', 'Груша'    from dual union all
  select 'Коля', 'Груша'    from dual
)
select 
  user_name, prod_name, count(*) cnt
from src
group by user_name, prod_name;


USER_NAME PROD_NAME CNTВася Груша 3Дима Яблоко 1Вася Апельсин 1Дима Груша 1Коля Груша 2Петя Апельсин 1Вася Яблоко 1Дима Апельсин 1

Ну а потом простая группировка на репортинге.
Имя - по строкам,
Товар - по столбцам.



Ну и результат:
...
Рейтинг: 0 / 0
19.11.2018, 14:28
    #39735144
leonidktoto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
EvgeniaMakarovaleonidktoto,

вот ,прямо Ваш пример

https://www.techonthenet.com/oracle/pivot.php

Да этот пример работает спасибо.
Запросы работают одинаково.

Что этот:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
SELECT TABLE1.NAME,
COUNT (CASE WHEN TABLE1.TOVAR='Груша' THEN TABLE1.NAME END) as "Груша",
COUNT (CASE WHEN TABLE1.TOVAR='Апельсин' THEN TABLE1.NAME END) as "Апельсин",
COUNT (CASE WHEN TABLE1.TOVAR='Яблоко' THEN TABLE1.NAME END) as "Яблоко"
FROM TABLE1
GROUP BY TABLE1.NAME
ORDER BY 
TABLE1.NAME


Что этот:
Код: plsql
1.
2.
3.
4.
5.
6.
SELECT * FROM 
(SELECT NAME, TOVAR FROM TABLE1)
PIVOT
(COUNT (TOVAR)
FOR TOVAR IN ('Груша','Апельсин','Яблоко'))
ORDER BY  NAME



Вопрос в другом теперь как отсортировать?
чтоб было так
Имя Груша Апельсин Яблоко
Вася 3 1 1
Дима 1 1 1
Коля 2 0 0
Петя 0 1 0
...
Рейтинг: 0 / 0
19.11.2018, 14:53
    #39735156
Алымов Анатолий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
А сортировка по какому принципу - убыванию общего количества товаров?
...
Рейтинг: 0 / 0
19.11.2018, 14:55
    #39735158
Алымов Анатолий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Если так, то ничего сложного:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with src(name, tovar) as
(
  select 'Вася', 'Груша'    from dual union all
  select 'Вася', 'Апельсин' from dual union all
  select 'Вася', 'Груша'    from dual union all
  select 'Вася', 'Груша'    from dual union all
  select 'Вася', 'Яблоко'   from dual union all
  select 'Петя', 'Апельсин' from dual union all
  select 'Дима', 'Груша'    from dual union all
  select 'Дима', 'Яблоко'   from dual union all
  select 'Дима', 'Апельсин' from dual union all
  select 'Коля', 'Груша'    from dual union all
  select 'Коля', 'Груша'    from dual
)
SELECT name, tovar1, tovar2, tovar3 FROM 
(SELECT NAME, TOVAR, (count(*) over (partition by NAME)) cnt FROM src )
PIVOT
(COUNT (TOVAR)
FOR TOVAR IN ('Груша' as tovar1,'Апельсин' as tovar2,'Яблоко' as tovar3))
	
ORDER BY cnt desc
...
Рейтинг: 0 / 0
19.11.2018, 15:25
    #39735167
leonidktoto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Алымов АнатолийЕсли так, то ничего сложного:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with src(name, tovar) as
(
  select 'Вася', 'Груша'    from dual union all
  select 'Вася', 'Апельсин' from dual union all
  select 'Вася', 'Груша'    from dual union all
  select 'Вася', 'Груша'    from dual union all
  select 'Вася', 'Яблоко'   from dual union all
  select 'Петя', 'Апельсин' from dual union all
  select 'Дима', 'Груша'    from dual union all
  select 'Дима', 'Яблоко'   from dual union all
  select 'Дима', 'Апельсин' from dual union all
  select 'Коля', 'Груша'    from dual union all
  select 'Коля', 'Груша'    from dual
)
SELECT name, tovar1, tovar2, tovar3 FROM 
(SELECT NAME, TOVAR, (count(*) over (partition by NAME)) cnt FROM src )
PIVOT
(COUNT (TOVAR)
FOR TOVAR IN ('Груша' as tovar1,'Апельсин' as tovar2,'Яблоко' as tovar3))
	
ORDER BY cnt desc



Сортировку нужно сделать по принципу, на первом месте должны быть те у кого есть и яблоко и груша и апельсин. Не зависимо от суммы товаров.

Имя Груша Апельсин Яблоко
Вася 3 1 1
Дима 1 1 1
Коля 9 0 0
...
Рейтинг: 0 / 0
19.11.2018, 15:30
    #39735168
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
leonidktoto,

sign+sign+sign, count+count+count, count, count, count
...
Рейтинг: 0 / 0
19.11.2018, 15:33
    #39735169
Dshedoo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
leonidktoto,

Код: plsql
1.
2.
ORDER BY decode(tovar1,0,0,1) + decode(tovar2,0,0,1) + decode(tovar3,0,0,1) desc 
, tovar1 + tovar2 + tovar3 desc
...
Рейтинг: 0 / 0
19.11.2018, 15:42
    #39735174
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
Dshedoo,

decode(tovar1,0,0,1) если нет отрицательных (а их нет) - эквивалентно sign(tovar1)

а в Вашем случае можно
Код: plsql
1.
sign(tovar1+tovar2+tovar3)
...
Рейтинг: 0 / 0
19.11.2018, 15:44
    #39735176
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
MaximaXXL,

А нет,
Код: plsql
1.
sign(tovar1)+sign(tovar2)+sign(tovar3)
...
Рейтинг: 0 / 0
19.11.2018, 16:37
    #39735221
leonidktoto
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите с запросом
MaximaXXL,
Ребята спасибо) sign то что нужно)
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите с запросом / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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