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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.10.2009, 20:00   #1
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию Помогите составить запрос, остатков и оборотов за период, с группировками и...

Помогите составить SQL запрос (MS SQL 2005), остатков и оборотов за период, с группировками и суммами следующего вида:



Никак не въеду, как это сделать..
Заранее спасибо.

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

пока не будет описания структуры данных (движухи и самих остатков) говорить не о чем
максимум что могу - написать 7 юнионов
soleil@mmc вне форума Ответить с цитированием
Старый 14.10.2009, 20:23   #3
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию

Есть таблица движений (некий аналог регистра остатков и оборотов 1с).
В нем имеются следующие поля:

_ID - ключ, автоинкрементное поле (bigint)
_OPERATION_ID - идентификатор операции (движения)
_DOCUMENT_ID - идентификатор документа (которое добавило данное движение)
_PERIOD - период движения (DateTime)
_BRANCH_ID - организация
ACCOUNTABLE_PERSON_TYPE_ID - тип подотчетника (у меня их два: организация или сотрудник)
ACCOUNTABLE_PERSON_ID - идентификатор подотчетника
INSURANCE_CLASS_ID - идентификатор класса страхования
SERIES_ID - идентификатор серии бланков строгой отчетности
BSO_NUMBER - номер бланка СО
COUNT - количество (1 или -1, в зависимости от операции)

Просто остатки я получил без проблем, а вот прицепить туда обороты не получается...(
BOZKURT вне форума Ответить с цитированием
Старый 14.10.2009, 20:27   #4
BOZKURT
Пользователь
 
Регистрация: 14.10.2009
Сообщений: 70
По умолчанию

Вот мой текущий запрос:

Код:
SELECT DISTINCT 
                    row_number() over(partition BY REG_BLANKS.ACCOUNTABLE_PERSON_TYPE_ID, REG_BLANKS.ACCOUNTABLE_PERSON_ID, REG_BLANKS.INSURANCE_CLASS_ID, REG_BLANKS.SERIES_ID order by REG_BLANKS.ACCOUNTABLE_PERSON_TYPE_ID, REG_BLANKS.ACCOUNTABLE_PERSON_ID, REG_BLANKS.INSURANCE_CLASS_ID, REG_BLANKS.SERIES_ID, REG_BLANKS.BSO_NUMBER) NPP,

                                          REG_BLANKS.ACCOUNTABLE_PERSON_ID, REG_BLANKS.ACCOUNTABLE_PERSON_TYPE_ID, 
                                          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 = REG_BLANKS.ACCOUNTABLE_PERSON_ID) WHEN ACCOUNTABLE_PERSON_TYPE_ID = 2 THEN
                                              (SELECT     NAME
                                                FROM          USERS
                                                WHERE      _ID = REG_BLANKS.ACCOUNTABLE_PERSON_ID) END AS ACCOUNTABLE_PERSON, 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, SUM(REG_BLANKS.COUNT) AS COUNT
                    FROM         REG_BLANKS INNER JOIN
                                          SPR_INS_CLASSES ON REG_BLANKS.INSURANCE_CLASS_ID = SPR_INS_CLASSES._ID INNER JOIN
                                          SPR_NUMBER_SERIES ON REG_BLANKS.SERIES_ID = SPR_NUMBER_SERIES._ID
                    
                    WHERE 1=1
                    
                    GROUP BY REG_BLANKS.ACCOUNTABLE_PERSON_TYPE_ID, REG_BLANKS.ACCOUNTABLE_PERSON_ID, REG_BLANKS.INSURANCE_CLASS_ID, 
                                          SPR_INS_CLASSES.NAME, REG_BLANKS.SERIES_ID, SPR_NUMBER_SERIES.NAME, REG_BLANKS.BSO_NUMBER
                    HAVING      (SUM(REG_BLANKS.COUNT) > 0)
                    ORDER BY REG_BLANKS.ACCOUNTABLE_PERSON_TYPE_ID, REG_BLANKS.ACCOUNTABLE_PERSON_ID, ACCOUNTABLE_PERSON_TYPE_NAME, 
                                          ACCOUNTABLE_PERSON, REG_BLANKS.INSURANCE_CLASS_ID, INSURANCE_CLASS_NAME, REG_BLANKS.SERIES_ID, SERIES_NAME, 
                                          REG_BLANKS.BSO_NUMBER
BOZKURT вне форума Ответить с цитированием
Старый 14.10.2009, 21:54   #5
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну запрос этот просто издевательство как минимум в плане чтения
и сам запрос - это только подытоги?
предлагаю пока писать без расшифровки (т.е. пока без слияния с SPR_...)

а в МССКЛ2005 есть group by rollup / grouping_id() ?

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

Да, поддерживает rollup.
Нетолько подитоги, по желанию пользователя я должен расшифровать вплоть до номера БСО.
Ну за чтение запроса, звиняйте, я замучался уже его приводить к читабельному виду, руки надо оторвать MS-вцам за такое форматирование в интерпрайс менеджере..))

Код:
SELECT DISTINCT 
	REG_BLANKS.INSURANCE_CLASS_ID, 
	REG_BLANKS.SERIES_ID, 
	REG_BLANKS.BSO_NUMBER, 
	SUM(REG_BLANKS.COUNT) AS COUNT
FROM
	REG_BLANKS 
                    
WHERE 1=1

GROUP BY 
	REG_BLANKS.INSURANCE_CLASS_ID, 
	REG_BLANKS.SERIES_ID, 
	REG_BLANKS.BSO_NUMBER

HAVING      
	(SUM(REG_BLANKS.COUNT) > 0)

ORDER BY 
	REG_BLANKS.INSURANCE_CLASS_ID, 
	REG_BLANKS.SERIES_ID, 
	REG_BLANKS.BSO_NUMBER

Т.е. в этом запросе, я получаю остатки не на дату, а вообще, что осталось на момент выполнения запроса (условие по периоду потом сделаю).

Условие "WHERE 1=1" служит ключевым выражением, для замены на динамические условия запроса (по выбранным параметрам пользователя).

Последний раз редактировалось BOZKURT; 14.10.2009 в 22:42. Причина: администрация, такие вопросы задаёте, аж неудобно отвечать...
BOZKURT вне форума Ответить с цитированием
Старый 14.10.2009, 22:43   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

уже лучше
давай я тебе завтра точно все нарисую
а сейчас помедитирую над тем что дает вот это
кстати, и зачем тебе дистинкт в группбае?
Код:
select 
  grouping_id(rb.insurance_class_id, rb.series_id, rb.bso_number) f_level,
  rb.insurance_class_id, 
  rb.series_id, 
  rb.bso_number, 
  sum(rb.count) as count
from reg_blanks rb                    
where 1=1
group by rollup(rb.insurance_class_id, rb.series_id, rb.bso_number)
having sum(rb.count) > 0
/*order by rb.insurance_class_id, rb.series_id, rb.bso_number*/
апд
а у тебя обороты и остатки в одной таблице?
если так, то может стоит с нуля нормально написать с учетом остатков?!
и что там в СК кроме бабла еще можно приходовать/расходовать?

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

ок, я тоже уже никакой, спать охота..))
согласен с дистинктом, недосмотрел.
спасибо!

переделал твой запрос, вот так на MSSQL2005 не вызывает эксепшена:

Код:
SELECT     
	grouping(INSURANCE_CLASS_ID) AS Expr1, 
	grouping(SERIES_ID) AS Expr2, 
	grouping(BSO_NUMBER) AS Expr3, 
	INSURANCE_CLASS_ID, 
	SERIES_ID, 
	BSO_NUMBER, 
	SUM(COUNT) AS count
FROM
	REG_BLANKS AS rb

WHERE     (1 = 1)

GROUP BY 
	INSURANCE_CLASS_ID, 
	SERIES_ID, 
	BSO_NUMBER 
WITH ROLLUP
HAVING
(SUM(COUNT) > 0)
[/CODE]
... )

апд:

Остатки и обороты в одной таблице.
Кстати, хорошая идея, сделать отдельную оборотную (приход и расход = 2 таблицы, надо подумать) таблицу, просто не хотелось чтобы БД раздувалась, обороты у СК большие..
Кроме бабла СК, меня больше ничего не интересует, да и нет у них больше ничего..))

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

Цитата:
Сообщение от BOZKURT Посмотреть сообщение
Остатки и обороты в одной таблице.
Кстати, хорошая идея, сделать отдельную оборотную (приход и расход = 2 таблицы, надо подумать) таблицу, просто не хотелось чтобы БД раздувалась, обороты у СК большие..
не-не-не
я такого не предлагал
оставляй как есть
я спрашивал про остатки: видимо, остатки ты получаешь суммированием всех приходов/расходов на начало периода?
т.е. остаток расчетный, а не хранимый где-то еще

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

Цитата:
Сообщение от soleil@mmc Посмотреть сообщение
я спрашивал про остатки: видимо, остатки ты получаешь суммированием всех приходов/расходов на начало периода?
т.е. остаток расчетный, а не хранимый где-то еще


просто там остатки в штуках, а не в тысячах/миллионах/копейках
Ага, получаю суммированием прихода и расхода.
В штуках конечно, это же бланки.
А полисы с суммами потом буду в другом регистре учитывать.

Получается что то вроде (1С) Регистр.ПартииБСО и Регистр.ПартииПолисов.
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