|
|
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
Приветствую! Помогите пожалуйста, может есть какие мысли или кто-нибудь сталкивался с подобной задачкой... Итак 1. Есть таблица событий с полем дата события (например дата выписаного счета) и ID клиента (из справочника клиентов) 2. Хочется получить в результате запроса датасет сгруппированный по месяцам за текущий и прошлый год (развернутый горизантально) 3. И самое интересное... в текущем году некоторый клиенты могут отсутствовать (ну не платили ни разу пока...) тогда за этот год нет в результате строки с этим клиентом Как я это делал... 1. сделал хранимку которая группирует по месяцам и клиентам Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 2. сделал другую хранимку к-рая селектит и группирует из первой хранимки Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. потом делаю селект с нужными мне параметрами из 2-й хранимки Код: plaintext 1. И получаю пимерно следующее... немного порезано, но надеюсь смысл понятен... Код: plaintext 1. 2. 3. 4. 5. 6. 7. и ВОТ собссно вопрос..... как бы сделать так, чтобы при отсутствии записей по фирме N в текущем году в результирующий датасет писалась строчка с нулевыми значениями по всем месяцам ??? Заранее благодарен даже тем, кто хотя бы дочитал до конца ;) короче изложить не получилось... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 20:42:48 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
Делаеш выборку по CUSTOMER, а ужо потом выбираешь данные. for select id from CUSTOMERS into :кто-то do begin ... /*твои выборки*/ where N.CUSTOMER = :кто-то suspend; end и еще можешь все это засунуть в цикл по условию - месяц 1-12 типа i=1; while(i<13) do begin ... /*все прочее*/ end Можно и лучше, но сильно думая или через временные таблицы, а в чистом виде их нет. увы! А зачастую времени думать нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 22:30:16 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
Чуть не чокнулся ! Если я хоть что то понял, то тебе надо убить вторую ХП, а первую уменьшить раз в 12 и данные из нее вытаскивать простеньким запросом типа Select * From GET_GROUP_NOTES_BY_MONTH(IP_BROKER,IP_YEAR) ORDER BY NAME_FOR_DISPLAY,YEAR Descending. Насколько я понял, что такое UDF, ты не знаешь. Обязательно ознакомься. Приведение типов слишком усложняешь. На сегодня сил уже нет, завтра попробую предложить рабочий вариант. З.Ы. Надеюсь, кто-нибудь меня опередит :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 22:36:01 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
Ооо, слава Богу, нашлась добрая душа ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 22:41:55 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
Не все понял, но все же :). Сделать View/SP с полями типа Extract(Month From MyDate) , сгруппировать и прицепить Left Join к списку клиентов, у неплативших будет Null соответственно.. ---------------------------------- Access Denied. FireBird recomended. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 22:46:34 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
AndriyKoНасколько я понял, что такое UDF, ты не знаешь. Обязательно ознакомься. А при чем здеся UDFки, чЁб с датами работать чтоль???? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 22:48:01 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
Тут только одно, проход в запрсе по всем клиентам, и более ничего не придумаешь. Противно, но других вариантов за 2 года я не придумал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 22:53:17 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
ЛкшыА при чем здеся UDFки, чЁб с датами работать чтоль???? Ну да, месяц вытаскивать. Можно как то еще ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 22:54:16 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
Тут только одно, проход в запрсе по всем клиентам, и более ничего не придумаешь. Противно, но других вариантов за 2 года я не придумал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 22:54:43 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
ЛкшыТут только одно, проход в запрсе по всем клиентам, и более ничего не придумаешь. Противно, но других вариантов за 2 года я не придумал. Зациклило ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 22:56:15 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
AndriyKoЗациклило ? Почти, пиво на ночь в таких объемах, все-таки тяжело, можно и потупить;-)). Вообще-то я обычно смотрю, о чем люди трепятся. и Молчу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2004, 23:09:26 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
ЛкшыДелаеш выборку по CUSTOMER, а ужо потом выбираешь данные. for select id from CUSTOMERS into :кто-то do begin ... /*твои выборки*/ where N.CUSTOMER = :кто-то suspend; end и еще можешь все это засунуть в цикл по условию - месяц 1-12 типа i=1; while(i<13) do begin ... /*все прочее*/ end Можно и лучше, но сильно думая или через временные таблицы, а в чистом виде их нет. увы! А зачастую времени думать нет. Спасибо за дельные советы! Оно конечно так... можно уменьшить в 12 раз, торопился по-быстренькому слепить - не до красоты было, но проблеммы это не решит... все равно если не было проплаты в текушем году, то не будет и строчки в результирующем датасете, а её как раз и надо получить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2004, 14:57:52 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
It-ant торопился по-быстренькому слепить - не до красоты было, но проблеммы это не решит... все равно если не было проплаты в текушем году, то не будет и строчки в результирующем датасете, а её как раз и надо получить Да че ж не решит-то ??? Внутри цикла For Select ... From Customer всунь ишо один цикл от предыдущего года до запрашиваемого и в энтом цикле вытаскивай нужные тебе данные, а затем однозначно делай suspend. Есть еще масса вариантов - будут тебе и нолики и крестики и какава с чаем (С). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2004, 15:27:57 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
Можно внутри select'а по клиентам сделать цикл по нужным месяцам/годам, а потом уже делать выборку по сумме. хотя основной гемор будет с обработкой (вычленением из дат месяцов через функции). у меня сделано по другому. все данные учитываются в контексте дней. соответственно новый день добавляет в справочник дат себя с новым идом, кроме всего в доп поля в этом справочнике генерится ид (сквозной по справочнику) для месяца этой даты и года. таким образом у меня будет for select по объединению справочника клиентов и дат за нужный период, а потом выборка из таблиц данных с агрегацией. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2004, 15:52:58 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
AndriyKo It-ant торопился по-быстренькому слепить - не до красоты было, но проблеммы это не решит... все равно если не было проплаты в текушем году, то не будет и строчки в результирующем датасете, а её как раз и надо получить Да че ж не решит-то ??? Внутри цикла For Select ... From Customer всунь ишо один цикл от предыдущего года до запрашиваемого и в энтом цикле вытаскивай нужные тебе данные, а затем однозначно делай suspend. Есть еще масса вариантов - будут тебе и нолики и крестики и какава с чаем (С). не совсем понял как select "то_чего_нет_в_базе" from .... что-то может вернуть ;) но буду пробовать в этом направлении... мож фиктивный suspend сделаю по условию not exist. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2004, 16:42:02 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
It-antне совсем понял как select "то_чего_нет_в_базе" from .... что-то может вернуть ;) но буду пробовать в этом направлении... мож фиктивный suspend сделаю по условию not exist. Не, не то. Имел в виду примерно следующее : For Select ...чего нужно... From Customer Do Begin CurrentYear=IP_YEAR-1; While (CurrentYear<=IP_YEAR) Do Begin JAN=0.00;FEB=0.00;... и так все месяцы Вытаскиваешь все нужные данные за год CurrentYear всякими там SUM, Group By и т.п. в поля JAN,FEB.... Suspend; CurrentYear=CurrentYear+1; End End Это если тебе надо только за 2 года. Но вааще-то подобные вещи хорошо делать универсальными, т.е. не "CurrentYear=IP_YEAR-1;", а "CurrentYear=IP_YEAR-CountYear;", а CountYear передаешь в ХП в качестве входного параметра. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2004, 16:54:14 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
AndriyKo It-antне совсем понял как select "то_чего_нет_в_базе" from .... что-то может вернуть ;) но буду пробовать в этом направлении... мож фиктивный suspend сделаю по условию not exist. Не, не то. Имел в виду примерно следующее : For Select ...чего нужно... From Customer Do Begin CurrentYear=IP_YEAR-1; While (CurrentYear<=IP_YEAR) Do Begin JAN=0.00;FEB=0.00;... и так все месяцы Вытаскиваешь все нужные данные за год CurrentYear всякими там SUM, Group By и т.п. в поля JAN,FEB.... Suspend; CurrentYear=CurrentYear+1; End End Это если тебе надо только за 2 года. Но вааще-то подобные вещи хорошо делать универсальными, т.е. не "CurrentYear=IP_YEAR-1;", а "CurrentYear=IP_YEAR-CountYear;", а CountYear передаешь в ХП в качестве входного параметра. Во! точно это!!! так и сделаю спасибо! А вообще как народ решает задачки развернуть горизонтально результаты группировки ??? может есть какие проторенные дорожки при условии, что количество колонок заранее не известно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2004, 17:30:40 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
я не заморачиваюсь, а делаю группировку вертикально, а "разворачиваю" на клиенте ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2004, 17:43:39 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
Аналогично. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2004, 17:54:45 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
visя не заморачиваюсь, а делаю группировку вертикально, а "разворачиваю" на клиенте Я понимаю когда - печатные отчеты, а когда в грид хочется показать? тут гимора на клиенте больше будет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2004, 18:02:00 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
visя не заморачиваюсь, а делаю группировку вертикально, а "разворачиваю" на клиенте Тики так. авторЯ понимаю когда - печатные отчеты, а когда в грид хочется показать? Тогда только ХП. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2004, 18:10:03 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
It-ant Я понимаю когда - печатные отчеты, а когда в грид хочется показать? тут гимора на клиенте больше будет... А какая разница что делать? Формировать печатный отчет или заполнять ручками какой-нибудь грид? Алгоритм по идее примерно одинаковый... Так что и "гимора" - одинаково ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2004, 19:36:58 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
doroshkaА какая разница что делать? Формировать печатный отчет или заполнять ручками какой-нибудь грид? Алгоритм по идее примерно одинаковый... Так что и "гимора" - одинаково ;) Все ж я думаю, однозначно тут нельзя судить. Если тебе необходимо из ХП 1-N столбцов вытащить, то как бы и деваться некуда - на клиента надо эту работу перекладывать - не изменять же ХП в рантайме. А ежели количество столбцов фиксированное, тут уже есть смысл сравнивать характеристики компьютеров - клиента и сервера. Мне вот пришлось клиента на 1 пеньке крутить, так я после этого все возможные подобные "оформительские" работы на серваке делаю... В общем, индивидуальный подход, как всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2004, 20:36:23 |
|
||
|
Хитрая группировка по дате
|
|||
|---|---|---|---|
|
#18+
автор А вообще как народ решает задачки развернуть горизонтально результаты группировки ??? может есть какие проторенные дорожки при условии, что количество колонок заранее не известно? ... Я понимаю когда - печатные отчеты, а когда в грид хочется показать? тут гимора на клиенте больше будет... Выводи результаты в Excel. Чем не грид? ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2004, 16:04:35 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=32607139&tid=1578223]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
314ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
80ms |
get tp. blocked users: |
2ms |
| others: | 236ms |
| total: | 685ms |

| 0 / 0 |
