Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2009, 11:37   #11
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

и приведи еще пример исходных данных
например, для той же картинки в стартовом посте - как оно выглядит в самой таблице?

а то чота с этими полями (_BRANCH_ID - организация
ACCOUNTABLE_PERSON_TYPE_ID - тип подотчетника (у меня их два: организация или сотрудник)
ACCOUNTABLE_PERSON_ID - идентификатор подотчетника) непонятка

апд
пока ты там спишь я накидал пример
разберись что там написано
Код:
with
  reg_blanks as (
  select 1 id, 1001 operation_id, 11 document_id, 
         to_date('01.10.2009', 'DD.MM.YYYY') period, 221 branch_id, 
         1 accountable_person_type_id, 101 accountable_person_id,
         10 insurance_class_id, 12 series_id, 12031 bso_number, 5 i_count from dual union all
  select 2, 1002, 12, to_date('02.10.2009', 'DD.MM.YYYY'), 221, 1, 101, 10, 12, 12031, 15 from dual union all
  select 3, 1003, 12, to_date('12.10.2009', 'DD.MM.YYYY'), 221, 1, 108, 10, 12, 12031, 5 from dual union all
  select 4, 1004, 12, to_date('12.10.2009', 'DD.MM.YYYY'), 221, 2, 101, 10, 12, 12031, 25 from dual union all
  select 5, 1005, 12, to_date('13.10.2009', 'DD.MM.YYYY'), 221, 1, 108, 10, 12, 12031, -50 from dual union all
  select 6, 1006, 12, to_date('15.10.2009', 'DD.MM.YYYY'), 221, 2, 108, 10, 12, 12031, 15 from dual union all
  select 7, 1007, 12, to_date('18.10.2009', 'DD.MM.YYYY'), 221, 1, 101, 10, 12, 12031, 5 from dual union all
  select 15, 1015, 12, to_date('13.10.2009', 'DD.MM.YYYY'), 228, 1, 108, 10, 12, 12031, 50 from dual union all
  select 16, 1016, 12, to_date('15.10.2009', 'DD.MM.YYYY'), 228, 2, 108, 10, 12, 12031, -15 from dual union all
  select 17, 1017, 12, to_date('18.10.2009', 'DD.MM.YYYY'), 228, 1, 101, 10, 12, 12031, 5 from dual
  )

select 
  grouping(rb.branch_id) f_level,
  rb.insurance_class_id, 
  rb.series_id, 
  rb.bso_number, 
  rb.branch_id,
  sum(nvl(case 
     when rb.i_count > 0 then rb.i_count end, 0)) as receipt,
  sum(nvl(case 
     when rb.i_count < 0 then (-1) * rb.i_count end, 0)) as expense
from reg_blanks rb                    
where 1=1
group by rb.insurance_class_id, rb.series_id, rb.bso_number, rollup(rb.branch_id)
having sum(rb.i_count) > 0
я решил эти поля rb.insurance_class_id, rb.series_id, rb.bso_number убрать из роллапа
но это чистое имхо - на картинке неясно как эти поля влияют на итоговую выборку
пока не будет твоих тестовых данных, приведенный выше пример, не является конечным решением

если же эти поля придется учитывать в роллапе, то с группингом их лучше так связывать
Код:
select 
  grouping(rb.insurance_class_id) + 
  2 * grouping(rb.series_id) + 
  3 * grouping(rb.bso_number) +
  4 * grouping(rb.branch_id) f_level,
  rb.insurance_class_id, 
  rb.series_id, 
  rb.bso_number, 
  rb.branch_id,
  sum(rb.i_count) as amount
from reg_blanks rb                    
where 1=1
group by rollup(rb.insurance_class_id, rb.series_id, rb.bso_number, rb.branch_id)
having sum(rb.i_count) > 0
и этта...
некошерно обзывать поля таблиц зарезервированными словами
кол-во обычно транслируется в QTY, суммы - в AMOUNT

Последний раз редактировалось soleil@mmc; 15.10.2009 в 12:12.
soleil@mmc вне форума Ответить с цитированием
Старый 15.10.2009, 17:39   #12
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию

про некошерно согласен, переименую.
мне ролапы и гроупинги() не нужны, у меня все это отчет делает.
...
блин, фигня какая-то получается, при операции "Перемещение", делается расход "С кого то" и приход на "Кого то", так при самой верхней (да на всех уровнях) группировке, в поле "Приход" попадает приход по перемещению, а это неправильно.. если смотреть у "Подотчетника", то тогда, да, правильно показывается, шо делать...((

Код:
SELECT
                        ACCOUNTABLE_PERSON_TYPE_ID, 
                        ACCOUNTABLE_PERSON_ID, 
                        INSURANCE_CLASS_ID, 
                        INSURANCE_CLASS_NAME, 
                        SERIES_ID, 
                        SERIES_NAME, 
                        BSO_NUMBER, 
                        CASE WHEN ACCOUNTABLE_PERSON_TYPE_ID = 1 THEN 'Организации' 
                             WHEN ACCOUNTABLE_PERSON_TYPE_ID = 2 THEN 'Страховые агенты' 
                        END AS ACCOUNTABLE_PERSON_TYPE_NAME, 
                        CASE WHEN ACCOUNTABLE_PERSON_TYPE_ID = 1 THEN (SELECT NAME FROM SPR_BRANCHES
                                                                       WHERE _ID = SubQuery.ACCOUNTABLE_PERSON_ID) 
                             WHEN ACCOUNTABLE_PERSON_TYPE_ID = 2 THEN (SELECT NAME FROM USERS
                                                                       WHERE _ID = SubQuery.ACCOUNTABLE_PERSON_ID)
                        END AS ACCOUNTABLE_PERSON, 
                        SUM(0) AS OSTATOK_BEG,
                        SUM(RECEIPT) AS SUM_RECEIPT, 
                        SUM(EXPENSE) AS SUM_EXPENSE, 
                        SUM(RECEIPT - EXPENSE) AS OSTATOK_END
                    FROM
                        (SELECT
                            REG_BLANKS.ACCOUNTABLE_PERSON_TYPE_ID, 
                            REG_BLANKS.ACCOUNTABLE_PERSON_ID, 
                            REG_BLANKS.INSURANCE_CLASS_ID, 
                            SPR_INS_CLASSES.NAME AS INSURANCE_CLASS_NAME, 
                            REG_BLANKS.SERIES_ID, 
                            SPR_NUMBER_SERIES.NAME AS SERIES_NAME, 
                            REG_BLANKS.BSO_NUMBER, 
                            CASE WHEN REG_BLANKS.count > 0 THEN REG_BLANKS.count ELSE 0 END AS RECEIPT,
                            CASE WHEN REG_BLANKS.count < 0 THEN (- 1) * REG_BLANKS.count ELSE 0 END AS EXPENSE
                         FROM
                            REG_BLANKS 
                                INNER JOIN SPR_INS_CLASSES AS SPR_INS_CLASSES 
                                ON REG_BLANKS.INSURANCE_CLASS_ID = SPR_INS_CLASSES._ID 
                                
                                INNER JOIN SPR_NUMBER_SERIES AS SPR_NUMBER_SERIES 
                                ON REG_BLANKS.SERIES_ID = SPR_NUMBER_SERIES._ID) AS SubQuery
                    GROUP BY 
                        ACCOUNTABLE_PERSON_TYPE_ID, 
                        ACCOUNTABLE_PERSON_ID, 
                        INSURANCE_CLASS_ID, 
                        INSURANCE_CLASS_NAME, 
                        SERIES_ID, 
                        SERIES_NAME, 
                        BSO_NUMBER
                    ORDER BY 
                        ACCOUNTABLE_PERSON_TYPE_ID, 
                        ACCOUNTABLE_PERSON_ID, 
                        INSURANCE_CLASS_ID, 
                        INSURANCE_CLASS_NAME, 
                        SERIES_ID, 
                        SERIES_NAME, 
                        BSO_NUMBER
BOZKURT вне форума Ответить с цитированием
Старый 15.10.2009, 18:23   #13
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ты так и не ответил
Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
и приведи еще пример исходных данных
например, для той же картинки в стартовом посте - как оно выглядит в самой таблице?
какой отчет тебе это все сворачивает?
soleil@mmc вне форума Ответить с цитированием
Старый 15.10.2009, 18:54   #14
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию

Отчет в вижуал студии 2008, XtraReport от DevExpress, пишу на C#.
Там группировки в самом отчете настраиваешь и все пучком.

А сюда как прицепить файл? Или на файлообменник кинуть?
BOZKURT вне форума Ответить с цитированием
Старый 15.10.2009, 19:00   #15
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию


http://ifolder.ru/14514119

Последний раз редактировалось BOZKURT; 15.10.2009 в 19:28.
BOZKURT вне форума Ответить с цитированием
Старый 15.10.2009, 19:04   #16
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ты читать-то умеешь?
Цитата:
и приведи еще пример исходных данных
soleil@mmc вне форума Ответить с цитированием
Старый 15.10.2009, 19:26   #17
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
ты читать-то умеешь?
Умею..))
Ты не дал мне времени на догруз ссылки..
По ссылке http://ifolder.ru/14514119 лежит файл XML с данными и XSD со схемой датасета.

На основании этих данных я получаю отчет, картинка которого лежит в посте http://programmersforum.ru/showpost....9&postcount=15

Теперь вот думаю, как получить остаток на начало периода..)

Последний раз редактировалось BOZKURT; 15.10.2009 в 19:40.
BOZKURT вне форума Ответить с цитированием
Старый 15.10.2009, 20:16   #18
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от BOZKURT Посмотреть сообщение
Теперь вот думаю, как получить остаток на начало периода..)
напиши функу, которая будет возвращать остаток на определенную дату
soleil@mmc вне форума Ответить с цитированием
Старый 15.10.2009, 20:24   #19
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
напиши функу, которая будет возвращать остаток на определенную дату
если бы еще знать, как это делается..))

апд:

аа, ты имел ввиду хранимую процедурку?
BOZKURT вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не могу составить запрос bullvinkle SQL, базы данных 2 04.10.2009 22:55
Помогите, кому не жалко, составить запрос ГиТ SQL, базы данных 9 07.09.2009 07:05
помогите составить SQL запрос!!!! MAKSA БД в Delphi 12 07.08.2009 11:12
Помогите составить запрос или перепроектировать БД Neurotechnic БД в Delphi 1 27.07.2009 10:51
Запрос на подсчет записей за период Luna_13 БД в Delphi 3 13.10.2008 23:58