:: Игры Разума
Задачка (в основном на Оракле)
sphinx
Автор

Сообщений: 31180
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Вот интересная задачка, но, видимо, ее можно только на Оракле написать.. Ну, или адаптировать.

select 1 mesr, 10 s1 ,30 s2 , 0 pr from dual union
select 2 mesr, 50 s1 ,10 s2 , 1 pr from dual union
select 3 mesr, 20 s1 ,90 s2 , 0 pr from dual
Нужно получить что-то типа на этом наборе данных:
Mesr Str Kod_str PR S1 S2
ИТОГО 400 0 30 120 ----Типа подитоги по pr=0 (rollup)
1 МЕСЯЦ 401 0 10 30
3 МЕСЯЦ 402 0 20 90
ИТОГО 410 1 50 10
2 МЕСЯЦ 411 1 50 10
select 1 mesr, 10 s1 ,30 s2 , 0 pr from dual union
select 2 mesr, 50 s1 ,10 s2 , 1 pr from dual union
select 3 mesr, 20 s1 ,90 s2 , 1 pr from dual
на этом наборе данных:
Mesr Str Kod_str PR S1 S2
ИТОГО 400 0 10 30 ----Типа подитоги по pr=0 (rollup)
1 МЕСЯЦ 401 0 10 30
ИТОГО 410 1 70 100
2 МЕСЯЦ 411 1 50 10
3 МЕСЯЦ 412 1 20 90
select 1 mesr, 10 s1 ,30 s2 , 1 pr from dual union
select 2 mesr, 50 s1 ,10 s2 , 1 pr from dual union
select 3 mesr, 20 s1 ,90 s2 , 1 pr from dual
на этом наборе данных:
Mesr Str Kod_str PR S1 S2
ИТОГО 400 1 80 130 ----Типа подитоги по pr=0 (rollup)
1 МЕСЯЦ 401 1 10 30
2 МЕСЯЦ 402 1 50 10
3 МЕСЯЦ 403 1 20 90

Т.е. изменение параметра pr в SELECTах показывает изменение результирующей выборки. Кто справится?



P.S. Есть и свой вариант решения.. ;)


------------------
"Veni, vidi, vici!"(с)




Исправлено 1 раз(а). Последнее : sphinx, 10.04.14 16:10
Ratings: 0 negative/0 positive
Re: Задачка (в основном на Оракле)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
WITH TEST
AS (SELECT 1 MESR,
10 S1,
30 S2,
0 PR
FROM DUAL
UNION
SELECT 2 MESR,
50 S1,
10 S2,
1 PR
FROM DUAL
UNION
SELECT 3 MESR,
20 S1,
90 S2,
0 PR
FROM DUAL)
SELECT CASE
WHEN GROUPING(MESR) = 1 THEN 'Итого по pr=' || TO_CHAR(PR)
ELSE 'Месяц ' || TO_CHAR(MESR)
END
TITLE,
PR,
SUM(S1) S1,
SUM(S2) S2
FROM TEST
GROUP BY ROLLUP(MESR), PR
ORDER BY PR, GROUPING(MESR) DESC, MESR
Что такое str я не в курсе и потому не считал.
P.S. Написать такое можно на чём угодно - просто придётся UNION использовать там где нету встроенной функциональности подитогов... Формат запроса с With, конечно, тут просто для удобства - чтобы исходные данные отделить от собственно запроса.


------------------
WBR, Igor




Исправлено 1 раз(а). Последнее : Igor Korolyov, 10.04.14 17:13
Ratings: 0 negative/0 positive
Re: Задачка (в основном на Оракле)
Foxtrot

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
чтойта мну подсказывает, что задача поставлена не совсем корректна
или я не внимательно читаю


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Задачка (в основном на Оракле)
sphinx
Автор

Сообщений: 31180
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Foxtrot
чтойта мну подсказывает, что задача поставлена не совсем корректна
или я не внимательно читаю

Очень даже корректно. В своем варианте нашел ошибку - у меня в итогах вместо kod_str просто 400 выводилось, а должно 400+(N-1)*10, где N - номер подитогов.

А вариант Игоря завтра проверю, возможно его немного допилить надо..


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Задачка (в основном на Оракле)
sphinx
Автор

Сообщений: 31180
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Цитата:
Что такое str я не в курсе и потому не считал.

str - и нет в результирующей выборке, если сравнить шапку и выводимые данные, то в шапке 6 значений, а выводится 5:
MESR - месяц
STR - <фиг знает, может относится к MESR, типа MESR_STR>
KOD_STR - код строки, т.е. подитоги имеют код 410, 420, 430... (даже не так, месяцев больше 10 !)
PR - параметр
S1 - сумма 1
S2 - сумма 2


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Задачка (в основном на Оракле)
Foxtrot

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
Цитата:
STR - <фиг знает, может относится к MESR, типа MESR_STR>
то есть ты и сам не рулишь ситуацией? типа как в загадке про летающих крокодилов?
Цитата:
KOD_STR - код строки, т.е. подитоги имеют код 410, 420, 430... (даже не так, месяцев больше 10 !)
ктонить понимает этого уральского парня? доставляет последняя фраза о месяцах, хотя возможно речь идет не о календарных. а не проще показать формулу? или изюминка еще и в том, чтобы разгадать и ее
ждемс окончательно утвержденного варианта задачи


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Задачка (в основном на Оракле)
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
389 + DENSE_RANK() OVER (ORDER BY PR) * 10 +
ROW_NUMBER() OVER(PARTITION BY PR ORDER BY GROUPING(MESR) DESC, MESR)
KOD_STR,

Ну если логика в том чтобы начинать считать с 400, для каждой группы pr набавлять 10, в рамках группы упорядочивать по месяцу нумеруя последовательно и "итог" ставить первым...
P.S. В реальных запросах нах не нужно всё это считать, особенно подобные "номера строк"


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: Задачка (в основном на Оракле)
Foxtrot

Сообщений: 3408
Откуда: Куда:
Дата регистрации: 25.04.2003
до кучи мона прибавить размер кластера системного диска


------------------
Мойте ноги, моя ноги вы моете и руки
Ratings: 0 negative/0 positive
Re: Задачка (в основном на Оракле)
sphinx
Автор

Сообщений: 31180
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Игорь, респект!

Все взлетело, как и надо было.


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive
Re: Задачка (в основном на Оракле)
sphinx
Автор

Сообщений: 31180
Откуда: Каменск-Уральски
Дата регистрации: 22.11.2006
Насколько я понял, именно этой красивой конструкции мне и не хватало:

DENSE_RANK() OVER (ORDER BY PR)


------------------
"Veni, vidi, vici!"(с)
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 5 (Гостей: 5)

© 2000-2024 Fox Club 
Яндекс.Метрика