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

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

Красавица выручила.
...
Рейтинг: 0 / 0
Помогите с запросом
    #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
Помогите с запросом
    #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
Помогите с запросом
    #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
Помогите с запросом
    #39734978
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leonidktotoперечислить в запросе все 5000 имен не получится.Попроси на форуме. помогут набрать хоть 10 тысяч имен.
...
Рейтинг: 0 / 0
Помогите с запросом
    #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
Помогите с запросом
    #39735093
EvgeniaMakarova
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
leonidktoto,

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

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

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

.....
stax
...
Рейтинг: 0 / 0
Помогите с запросом
    #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
Помогите с запросом
    #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
Помогите с запросом
    #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
Помогите с запросом
    #39735156
Алымов Анатолий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А сортировка по какому принципу - убыванию общего количества товаров?
...
Рейтинг: 0 / 0
Помогите с запросом
    #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
Помогите с запросом
    #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
Помогите с запросом
    #39735168
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leonidktoto,

sign+sign+sign, count+count+count, count, count, count
...
Рейтинг: 0 / 0
Помогите с запросом
    #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
Помогите с запросом
    #39735174
MaximaXXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dshedoo,

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

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

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


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