Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Вниз

Запрос по месяцам и кварталам   Найти похожие ветки 

 
normandia   (2005-04-25 16:12) [0]

Есть таблица вида

фамилия      дата_оплаты     сумма
Иванов      01.01.2004       1500
Иванов      01.03.2004       2700
Петров      01.03.2004       2800
Сидоров     01.05.2004       3200
Петров      01.05.2004       1260

Нужен запрос с результатом с суммами по месяцам и итогами по кварталам и с группировкой по фамилиям вида

фамилия   январь февраль март 1квартал апрель май июнь 2квартал
Иванов    25000   16000
Петров    15000             и т.д.
Сидоров   25000

Помогите, люди добрые.


 
Val ©   (2005-04-25 16:25) [1]

Хорошо бы хранимой процедурой.


 
Johnmen ©   (2005-04-25 16:28) [2]

Чтоюы так сделать, придётся иметь не менее 15 вложенных запросов к основному. Тормоза...


 
raidan ©   (2005-04-25 16:29) [3]

>Val ©   (25.04.05 16:25) [1]
А иначе будет тупейший селект с выбором значений 16 раз (если не использовать with as, конечно) :)


 
stud ©   (2005-04-25 17:49) [4]

а если хп, одним основным запросом, а с помощью переменных/условий раскидывать по месяцам?


 
stud ©   (2005-04-25 17:53) [5]

группировать запрос по клиенту и (месяцу и году).
кол-во выходных параметров постоянно, наверное не так уж и сложно


 
Val ©   (2005-04-25 17:54) [6]

>[4] stud ©   (25.04.05 17:49)
передаем id чела и период - получаем сумму, потом комбинируем при выводе как хотим.


 
Johnmen ©   (2005-04-25 17:57) [7]

>stud ©   (25.04.05 17:49) [4]

Так и надо (Val уже сказал про ХП).


 
Fay ©   (2005-04-25 19:25) [8]

Какой движок?!


 
Johnmen ©   (2005-04-25 21:59) [9]

>Fay ©  (25.04.05 19:25) [8]
>Какой движок?!

1.6 литра, 16 клапанов, 110 лошадей


 
normandia   (2005-04-26 08:26) [10]

После перерыва я снова в инете.

Спасибо за внимание к вопросу.
Я насчет ХП сразу подумал, под Interbase без проблем.

Но попросили подобное сделать в MS Access (причем прямо в самой программе Access, без спец. программы на Delphi), а я с ним не очень хорошо знаком.
Как там насчет ХП?
Сейчас и сам тоже поковыряю его на этот предмет.
Времени немного есть.


 
Anatoly Podgoretsky ©   (2005-04-26 09:07) [11]

Типичный куб


 
msguns ©   (2005-04-26 09:27) [12]

Для начала я все ж таки определился бы с формой журнала - приведенный в сабже вид не существует в официальной отчетности и, видимо, придуман тетей машей.
Для обычных журналов промежуточные итоги по кварталам не нужны.

В любом случае для получения такого журнала (для отчетов в пенсионный фонд, видимо) надо создать временную таблицу, куда выборками запихивать подсчитанное из БД. Таблица нужна хотя бы по двум причинам:
1. Ее, возможно, будут править ручками
2. Ее надо хранить энное количество времени.


 
normandia   (2005-04-26 09:59) [13]

Форма придумана дядей Костей.
Раньше он вел ее в Word для унутреннего пользования (для себя).
Когда стала слишком большой, задумался об автоматизации.

В Access я ему быстренько состряпал выборку по указанному человеку за указанный любой интервал времени.
А потом собрался сделать указанную итоговую форму и уперся.

Не хотелось бы городить базу в Interbase, так как в принципе она небольшая. Лучше бы остаться в рамках Access, так как он уже есть.


 
Sergey13 ©   (2005-04-26 10:17) [14]

2 [13] normandia   (26.04.05 09:59)
Не понимаю я твоих метаний/сомнений. Если ты знаешь, как сделать на ИБ в ХП, то почему не можешь сделать то-же самое на делфовом клиенте? Какая разница то? Тем паче база "в принципе она небольшая".
Получи группировку по юзерам/месяцам и крути на клиенте как хочешь.


 
Val ©   (2005-04-26 10:42) [15]

> [14] Sergey13 ©   (26.04.05 10:17)
Судячи з усього...он делает на экцесс без делфевых и прочих клиентов. Тогда, лучший способ, наверное, таки временная таблица, хп-то там нет, насколько я понимаю.Хотя черт его знает - там бейсик не прикручен?(это больше к знатокам экцесса.)


 
Sergey13 ©   (2005-04-26 10:47) [16]

2[15] Val ©   (26.04.05 10:42)
Хм. Действительно. Сори.


 
msguns ©   (2005-04-26 12:02) [17]

>normandia   (26.04.05 09:59) [13]
>Форма придумана дядей Костей.
Раньше он вел ее в Word для унутреннего пользования (для себя).
Когда стала слишком большой, задумался об автоматизации.

Значицца так:
Таблицу размечаем в Екселе. Оттуда намного удобнее печатать и Константину удобнее будет с ворда перейти на ексель, чем в акцесс, где формы неудобные (для непривыкших).
В ексель запихиваем данные из Акцеса. Для этого в екселе пишем макрос, запускающий экзешник, котрый и перегоняет данные из акцеса в ексель. Другой макрос запускает экзешник, который будет "забирать" из екселя и писать в акцес измененные (добавленные) данные.
Два экзешника+макросы - вот, собсно, и все, что надо написать.

Есть, конечно, маленькие траблы по "забору" из екселя, связанные со "стыковкой" записей, но это уже дело техники ;))

Во как я придумал !!!


 
normandia   (2005-04-26 19:57) [18]


> msguns ©   (26.04.05 12:02) [17]

Круто загнул. Уважаю за размах.
Еще можно подключить winamp, чтобы все это выполнялось под танец с саблями или под гимн Советского Союза.
Дядя Костя обомлеет.

Но лучше сначала конечно помучиться.
Во-первых, хочу пошарить, что в Access есть типа ХП.
Во-вторых, очень смутно подозреваю, что могут помочь перекрестные запросы с подзапросами (хотя вряд ли).
В-третьих, пошел до завтра домой со всем этим разбираться.


 
aus   (2005-04-26 21:06) [19]

Добавь таблицу примерно такой структуры:
[Номер поля][Дата с][Дата по]
Запрос составляй с внешним объединением с этой таблицей, из этого запроса делай перекрестный, где [Номер поля] будет именем столбца, а фамилии - строками.
Мудрёно загнул, но вроде понятно, если вникнуть...


 
sniknik ©   (2005-04-26 21:48) [20]

чего же ты сразу не написал что у тебя Access? (тему видел и проигнорировал, сейчас заглянул случайно, просто больше ничего интересного нет...)

ХП тебе не поможет, в аксесе они убогие в одну команду, зато точно поможет (не раз делалось аналогичное) инструкция TRANSFORM PIVOT, транспонирует таблицу в Access, см. в нем хелп.

не знаю как в самом аксесе, а в дельфях (с аксесовской базой) я бы сделал простое транспонирование по месяцам а "1квартал/2квартал/..." вычисляемыми полями.
получилось бы очень просто, даже элементарно, хотя можно и кварталы просчитать. выделить через iif прямо в запросе (в условии не получится... наверное, а может и получится но будут вложенные запросы, тормоза...)


 
sniknik ©   (2005-04-26 22:05) [21]

вот в принципе запрос, только поля надо будет "развести"/поставить по местам (т.е. с первого места "1квартал" на четвертое после третьего месяца, и месяца переназвать/дисплейнейме поставить "январь" вместо 1-ци и т.д.).


TRANSFORM Sum([сумма])
SELECT
 [фамилия],
 Sum(iif(Month([дата_оплаты]) >=1 and Month([дата_оплаты]) <=3,[сумма],0))  AS [1квартал],
 Sum(iif(Month([дата_оплаты]) >=4 and Month([дата_оплаты]) <=6,[сумма],0))  AS [2квартал],
 Sum(iif(Month([дата_оплаты]) >=7 and Month([дата_оплаты]) <=9,[сумма],0))  AS [3квартал],
 Sum(iif(Month([дата_оплаты]) >=10 and Month([дата_оплаты]) <=12,[сумма],0))  AS [4квартал]
FROM [Есть_Tаблица_Bида]
GROUP BY [фамилия]
PIVOT Month([дата_оплаты]) IN (1,2,3,4,5,6,7,8,9,10,11,12)


 
normandia   (2005-04-27 09:03) [22]


> sniknik ©   (26.04.05 22:05) [21]

Спасибо.

Дома вечером посмотрел перекрестные запросы и сразу нашел TRANSFORM PIVOT.
Сделал два запроса: один по месяцам, другой по кварталам.
Теперь хочу попробовать смешанный.

А не подскажет кто, что конкретно делает TRANSFORM PIVOT?
А то получил результат, но не совсем понял, как оно работает.
Хочу уяснить на будущее.


 
sniknik ©   (2005-04-28 00:09) [23]

> Теперь хочу попробовать смешанный.
вот этот > [21] смешанный.


 
normandia   (2005-04-29 09:59) [24]


> sniknik ©   (26.04.05 22:05) [21]
> вот в принципе запрос, только поля надо будет "развести"/поставить
> по местам (т.е. с первого места "1квартал" на четвертое
> после третьего месяца, и месяца переназвать/дисплейнейме
> поставить "январь" вместо 1-ци и т.д.).

Прошу прощения за глупый вопрос.
А как развести и переназвать?

Напоминаю, пытаюсь все сделать только в Access без Delphi.
Получилось только вот так, в тупую:

TRANSFORM Sum([по всем исполнителям].[сумма]) AS сумма
SELECT [по всем исполнителям].[фамилия], Sum(IIf(Month([по всем исполнителям].[дата оплаты])=1,[по всем исполнителям].[сумма],0)) AS январь, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=2,[по всем исполнителям].[сумма],0)) AS февраль, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=3,[по всем исполнителям].[сумма],0)) AS март, Sum(IIf(Month([по всем исполнителям].[дата оплаты])>=1 And Month([по всем исполнителям].[дата оплаты])<=3,[по всем исполнителям].[сумма],0)) AS 1квартал, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=4,[по всем исполнителям].[сумма],0)) AS апрель, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=5,[по всем исполнителям].[сумма],0)) AS май, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=6,[по всем исполнителям].[сумма],0)) AS июнь, Sum(IIf(Month([по всем исполнителям].[дата оплаты])>=4 And Month([по всем исполнителям].[дата оплаты])<=6,[по всем исполнителям].[сумма],0)) AS 2квартал, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=7,[по всем исполнителям].[сумма],0)) AS июль, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=8,[по всем исполнителям].[сумма],0)) AS август, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=9,[по всем исполнителям].[сумма],0)) AS сентябрь, Sum(IIf(Month([по всем исполнителям].[дата оплаты])>=7 And Month([по всем исполнителям].[дата оплаты])<=9,[по всем исполнителям].[сумма],0)) AS 3квартал, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=10,[по всем исполнителям].[сумма],0)) AS октябрь, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=11,[по всем исполнителям].[сумма],0)) AS ноябрь, Sum(IIf(Month([по всем исполнителям].[дата оплаты])=12,[по всем исполнителям].[сумма],0)) AS декабрь, Sum(IIf(Month([по всем исполнителям].[дата оплаты])>=10 And Month([по всем исполнителям].[дата оплаты])<=12,[по всем исполнителям].[сумма],0)) AS 4квартал
FROM [по всем исполнителям]
GROUP BY [по всем исполнителям].[фамилия]
PIVOT Month([по всем исполнителям].[дата оплаты]) In (1,2,3,4,5,6,7,8,9,10,11,12);

Но тут получатся лишние столбцы в конце (1, 2, 3....).
Можно правда оставить только один
(PIVOT Month([по всем исполнителям].[дата оплаты]) In (1)).
Однако это не есть красиво.


 
Polevi ©   (2005-04-29 10:05) [25]

все проигнорировали [11]
а зря


 
sniknik ©   (2005-04-29 10:44) [26]

> А как развести и переназвать?
в дельфях легко. двойной клик на гриде, добавляеш колонки в нужном порядке, и там же есть displayname колонки. это все. в access х.з. не работаю в access хотя и использую access-овские базы (почемуто часто не видят разницы между этим ;), но должно быть чтото подобное (могу посмотреть, найти, но лень... по той же причине, не работаю, и не понадобится, и нужно не мне а тебе. иши).

Polevi ©   (29.04.05 10:05) [25]
почему проигнорировали? я к примеру обдумывал этот вариант... но, именно для access это лишнее, результат достигается проше. (имхо конечно)


 
Polevi ©   (2005-04-29 10:59) [27]

>sniknik ©   (29.04.05 10:44) [26]
проблема в том что большинство (имхо, сужу по вопросам) даже не понимают такое куб и многомерный анализ данных
и начинают тонны TRANSACT SQL советовать


 
AlexO   (2005-04-29 16:51) [28]

Я лично делаю так:

SELECT
[фамилия],
SUM(case when Month([дата_оплаты]) = 1 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 2 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 3 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 4 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 5 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 6 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 7 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 8 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 9 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 10 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 11 then [сумма] else 0 end),
SUM(case when Month([дата_оплаты]) = 12 then [сумма] else 0 end),
FROM [Tаблица]
WHERE [дата_оплаты]) between [data1] and [data2]
GROUP BY [фамилия]



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.06.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.013 c
14-1116405883
Weare
2005-05-18 12:44
2005.06.06
Процессы в Win2000


14-1116372170
Петр
2005-05-18 03:22
2005.06.06
Утечка памяти


9-1110470642
electroowl
2005-03-10 19:04
2005.06.06
Помогите установить glscene!!!


14-1116641547
Jeka
2005-05-21 06:12
2005.06.06
Цифровой фотоаппарат


1-1116700575
seregka
2005-05-21 22:36
2005.06.06
Проверка буквы на строчность





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский