for flooders
:: Главная :: Решения :: Статьи :: Сайт М. Дроздова :: Файловый архив :: Книга по VFP 9 :: Русский Help Online :: OFF-LINE Форум
   Л и с о в о д ы   в с е х   с т р а н,  о б ъ е д и н я й т е с ь !!!  

Список Форумов  :: Игры Разума
   :: Помощь сайту :: 

Задачка (в основном на Оракле)
sphinx
Автор

Сообщений: 22752
Откуда: Каменск-Уральски
Дата: 10.04.14 15:10:09ОтветитьЦитировать
Вот интересная задачка, но, видимо, ее можно только на Оракле написать.. Ну, или адаптировать.

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. Есть и свой вариант решения..


------------------
"Вы поступили правильно, мой друг, но, боюсь, совершили ошибку"..."(с)




Исправлено: sphinx, 10.04.14 15:10
Ratings: 0 negative/0 positive

Re: Задачка (в основном на Оракле)
Igor Korolyov

Сообщений: 32363
Дата: 10.04.14 16:10:34ОтветитьЦитировать
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




Исправлено: Igor Korolyov, 10.04.14 16:13
Ratings: 0 negative/0 positive

Re: Задачка (в основном на Оракле)
Foxtrot

Сообщений: 3370
Откуда: Куда:
Дата: 10.04.14 16:40:30ОтветитьЦитировать
чтойта мну подсказывает, что задача поставлена не совсем корректна
или я не внимательно читаю


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: Задачка (в основном на Оракле)
sphinx
Автор

Сообщений: 22752
Откуда: Каменск-Уральски
Дата: 10.04.14 19:34:05ОтветитьЦитировать
Foxtrot
чтойта мну подсказывает, что задача поставлена не совсем корректна
или я не внимательно читаю

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

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


------------------
"Вы поступили правильно, мой друг, но, боюсь, совершили ошибку"..."(с)
Ratings: 0 negative/0 positive

Re: Задачка (в основном на Оракле)
sphinx
Автор

Сообщений: 22752
Откуда: Каменск-Уральски
Дата: 10.04.14 19:42:44ОтветитьЦитировать
Цитата:
Что такое str я не в курсе и потому не считал.

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


------------------
"Вы поступили правильно, мой друг, но, боюсь, совершили ошибку"..."(с)
Ratings: 0 negative/0 positive

Re: Задачка (в основном на Оракле)
Foxtrot

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


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: Задачка (в основном на Оракле)
Igor Korolyov

Сообщений: 32363
Дата: 11.04.14 13:11:29ОтветитьЦитировать
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

Сообщений: 3370
Откуда: Куда:
Дата: 11.04.14 14:10:12ОтветитьЦитировать
до кучи мона прибавить размер кластера системного диска


------------------
P.S. будете проходить мимо, не стесняйтесь, проходите
Ratings: 0 negative/0 positive

Re: Задачка (в основном на Оракле)
sphinx
Автор

Сообщений: 22752
Откуда: Каменск-Уральски
Дата: 11.04.14 20:53:57ОтветитьЦитировать
Игорь, респект!

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


------------------
"Вы поступили правильно, мой друг, но, боюсь, совершили ошибку"..."(с)
Ratings: 0 negative/0 positive

Re: Задачка (в основном на Оракле)
sphinx
Автор

Сообщений: 22752
Откуда: Каменск-Уральски
Дата: 11.04.14 20:55:50ОтветитьЦитировать
Насколько я понял, именно этой красивой конструкции мне и не хватало:

DENSE_RANK() OVER (ORDER BY PR)


------------------
"Вы поступили правильно, мой друг, но, боюсь, совершили ошибку"..."(с)
Ratings: 0 negative/0 positive



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

On-line: 45 _vit  and Guests: 44


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