|
|
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
MaximaXXLNorman94, иначе говоря, тут не решают задачи, а помогают в решении envunpivot + stff start of group Должна была Вам помочь более чем Я написал работающий пример, рассказал что менять в соответствии с Вашими дополнениями Но я не вправе решать что Вам брать и что оставить для решения конкретно Вашей задачи. Проявите интеллект и подумайте ... И ещё последний вопрос, ответьте пожалуйста, в какое именно место нужно добавить, чтобы он искал именно те столбцы со значениями "о", потому что неисключено, что в таблице могут быть другие символы, которые в данном случае искать не нужно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 15:27 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94И ещё, как мне в таком случае сделать динамический общий запрос? Если я введу Код: sql 1. 2. 3. 4. Он выводит чушь в стиле N0101, N0202 Вы будто накручиваете счетчик сообщений что вернет column_name||(LTRIM(column_name,'N') если column_name = 'N01'? Norman94У меня такой глупый вопрос: unpivot можно использовать с динамическим блоком? Попробуйте, любой результат Вам будет на пользу ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 15:30 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
[quot Norman94]MaximaXXLNorman94, И ещё последний вопрос, ответьте пожалуйста, в какое именно место нужно добавить, чтобы он искал именно те столбцы со значениями "о", потому что неисключено, что в таблице могут быть другие символы, которые в данном случае искать не нужно нивкакое UNPIVOT без приставки INCLUDE NULLS просто выкинет столбцы с пустыми значениями. А вообще то мой Вам совет читайте доки и больше экспериментируйте и будет Вам счастье. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 15:35 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
MaximaXXL, Ладно, спасибо большое! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 15:49 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94Здравствуйте. Имеется длинная таблица состоящая из 30 столбцов, которые обозначаются неделями (N1, N2, N3 и т.д.) N1 N2 N3 N4 N5 N6 N7 N8 N9 N10 N11 N12 N13 N14 N15 N16 N17 о о о о о о о о о о Как видно, в некоторых неделях проставлены обозначения, когда у человека внеочередной отпуск. Собственно, как вывести интервал одной недели мне известно из этой функции create or replace FUNCTION get_week_list1(i_code IN INTEGER, i_year in integer) RETURN VARCHAR2 IS l_list VARCHAR2(32767); l_res VARCHAR2(4000); BEGIN SELECT listagg('CASE WHEN '||column_name||' IN(''о'') THEN '|| to_char( trunc (to_date(i_year||'0101', 'yyyymmdd') + ((LTRIM(column_name,'N'))-1)*7, 'ww'), 'dd.mm')||'||''; '' ELSE NULL END ' ,'||') WITHIN GROUP(ORDER BY 1) INTO l_list FROM user_tab_columns WHERE TABLE_NAME = 'GRAFIK' AND column_name LIKE 'N%'; EXECUTE IMMEDIATE 'SELECT '||l_list||' FROM GRAFIK WHERE kod_sotr=:A AND god=:year' INTO l_res USING i_code,i_year; RETURN RTRIM(l_res); END; Потом собственно в вызове я делаю запрос который выводит мне 1 и последнюю строку SELECT t.god, t.kod_sotr, regexp_substr (get_week_list1(t.kod_sotr,t.god), '^([[:digit:]]+)(,)([[:digit:]]+)(;)') as week_first, regexp_substr (get_week_list1(t.kod_sotr,t.god), '([[:digit:]]+)(,)([[:digit:]]+)(;)$') as week_last FROM GRAFIK t; Но что делать, если у меня 2 интервала недель? Нужен цикл? Если да, то подскажите как именно мне надо указать что вот там один интервал, а вот там другой? непонятно 1) почему нужен динамический? 2) странно что 31n, больше похоже на дни (недель в году больше) сделал влоб (Вам надо перечислить все N) Код: plsql 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. ps если обязательно надо динамически, то продолжим ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 17:50 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94MaximaXXLNorman94, иначе говоря, тут не решают задачи, а помогают в решении пропущено... Должна была Вам помочь более чем Я написал работающий пример, рассказал что менять в соответствии с Вашими дополнениями Но я не вправе решать что Вам брать и что оставить для решения конкретно Вашей задачи. Проявите интеллект и подумайте ... У меня такой глупый вопрос: unpivot можно использовать с динамическим блоком? да динмика нужна в случаях 1) неизвестно имя таблицы 2) неизвестны столбцы (их к-во) 3) в других (не Ваш случай, напр неизвестный линк) у Вас все определено таблица -GRAFIK, столбцы N* динамика в такой постановке не нужна мож Вам нужно оформить в виде ф-ции? то ето другой вопрос, используйте селесты в Вашей ф-ции ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 18:17 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
stax.., Нужна динамика, так как постоянно вручную набирать 52 столбца (которые характеризуют собой недели) устанешь быстро. Плюс, это одно из условии задачи. Я бы уже давно использовал UNPIVOT и не парился бы, но нет. Есть таблица GRAFIK. В ней такие поля как id_sotr (код сотрудника), god (год) и 52 недели N1, N2, N3 (30 в шапке я написал для примера, но понял что это глупость). Значения недели могут быть У (обозначает учебный отпуск) Б (за свой счёт), и О (вне очередной). Интервалы первых двух отпусков встречаются лишь один раз (такое условие), и функции их вызова я сделал (пример в шапке). Теперь же нужна функция, которая динамическим прогоном и с помощью цикла находила два интервала отпуска (то есть первое количество недель и второе). Блин, почему же я так сразу всё не пояснил, стыд то какой... Спасибо вам, stax. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 20:46 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94stax.., Нужна динамика, так как постоянно вручную набирать 52 столбца (которые характеризуют собой недели) устанешь быстро. Плюс, это одно из условии задачи. Я бы уже давно использовал UNPIVOT и не парился бы, но нет. Есть таблица GRAFIK. В ней такие поля как id_sotr (код сотрудника), god (год) и 52 недели N1, N2, N3 (30 в шапке я написал для примера, но понял что это глупость). Значения недели могут быть У (обозначает учебный отпуск) Б (за свой счёт), и О (вне очередной). Интервалы первых двух отпусков встречаются лишь один раз (такое условие), и функции их вызова я сделал (пример в шапке). Теперь же нужна функция, которая динамическим прогоном и с помощью цикла находила два интервала отпуска (то есть первое количество недель и второе). Блин, почему же я так сразу всё не пояснил, стыд то какой... Спасибо вам, stax. не вижу проблем набрать 51поле если обязательное условие динамика то для MaximaXXL генерите with i in (N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11)) для моего варіанта case для Вашего (із первого поста) может будет достаточно для разных букв (отпусков) брать разные разделители если обязательное условие функция, то опишите требование, что должна вернуть ф-ция приведите пример данных и что получитиь (вернуть) и 1) нужна ф-ция 2) достатотчно селекта зы на примере, мне легче понять что надо решить ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 21:45 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
stax..Norman94stax.., Нужна динамика, так как постоянно вручную набирать 52 столбца (которые характеризуют собой недели) устанешь быстро. Плюс, это одно из условии задачи. Я бы уже давно использовал UNPIVOT и не парился бы, но нет. Есть таблица GRAFIK. В ней такие поля как id_sotr (код сотрудника), god (год) и 52 недели N1, N2, N3 (30 в шапке я написал для примера, но понял что это глупость). Значения недели могут быть У (обозначает учебный отпуск) Б (за свой счёт), и О (вне очередной). Интервалы первых двух отпусков встречаются лишь один раз (такое условие), и функции их вызова я сделал (пример в шапке). Теперь же нужна функция, которая динамическим прогоном и с помощью цикла находила два интервала отпуска (то есть первое количество недель и второе). Блин, почему же я так сразу всё не пояснил, стыд то какой... Спасибо вам, stax. не вижу проблем набрать 51поле если обязательное условие динамика то для MaximaXXL генерите with i in (N1,N2,N3,N4,N5,N6,N7,N8,N9,N10,N11)) для моего варіанта case для Вашего (із первого поста) может будет достаточно для разных букв (отпусков) брать разные разделители если обязательное условие функция, то опишите требование, что должна вернуть ф-ция приведите пример данных и что получитиь (вернуть) и 1) нужна ф-ция 2) достатотчно селекта зы на примере, мне легче понять что надо решить ..... stax Ну вот смотрите, пример того, как я вытаскиваю интервал одного отпуска (учебного) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Входными параметрами являются код сотрудника и год по которому я смотрю отпуск. Данная функция работает с одним интервалом недель, но если их две, то нет - он тупо выводит первую неделю первого интервала и последнюю неделю последнего интервала. Кстати сам вызов идёт тут. Тут же идёт вычисление интервала Код: plsql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2017, 22:10 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94... Входными параметрами являются код сотрудника и год по которому я смотрю отпуск. Данная функция работает с одним интервалом недель, но если их две, то нет - он тупо выводит первую неделю первого интервала и последнюю неделю последнего интервала. [/src] буду отвечать частями ето не так 1) добавить сортировку (если надо), иначе может случится так что 51я неделя будет не последней ORDER BY 1 не сортирует, 1 ето не номер столбца, ето константа 2)функция работает с МНОГИМИ "нтервалами" недель (вернее она не интервалы выводит) ф-ция вывовит недели где o кстати Вы используете ww, непонятно зачем Код: plsql 1. 2. 3. 4. 5. 6. 7. авторКстати сам вызов идёт тут. Тут же идёт вычисление интервала [src oracle] SELECT t.god, t.kod_sotr, regexp_substr (get_week_list1(t.kod_sotr,t.god), '^([[:digit:]]+)(,)([[:digit:]]+)(;)') as week_first, regexp_substr (get_week_list1(t.kod_sotr,t.god), '([[:digit:]]+)(,)([[:digit:]]+)(;)$') as week_last FROM GRAFIK t; ф-ція не причем, она отрабытыват правильно а от вычисление, если "интервал" не один у Вас неправильно, его (вызов/селект) надо переписывать как, другой вопрос так как у Вас "идёт вычисление интервала" всеравно в селекте, то ф-ция не нужна (кроме случая что она где-то еще используется) Вам надо определится 1) нужна ли ф-ция, и если нужна то что она должна возвращать (напр сразу 08.01/19.02; 05.03/05.03); 2) если ф-ция нужна именно такая как есть, то переписать селект в котором "идёт вычисление интервала" 3) сделать селектом без ф-ции зы когда-то наш архитектор тоже график хотел сделать как у вас но поденный мне повезло, что в старых версиях оракля табличку с 370полями создать было невозможно pss еще раз динамика СДЕСЬ не нужна, перечислить 51 case не проблема аргумент я віжу токо один начальник требует через динамику! (Я СКАЗАЛ!!!) ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 13:10 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
stax..еще раз динамика СДЕСЬ не нужна, перечислить 51 case не проблемаДа просто ненормализованному горе-дизайнеру ноги повыдёргивать нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 13:17 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94MaximaXXLNorman94, иначе говоря, тут не решают задачи, а помогают в решении пропущено... Должна была Вам помочь более чем Я написал работающий пример, рассказал что менять в соответствии с Вашими дополнениями Но я не вправе решать что Вам брать и что оставить для решения конкретно Вашей задачи. Проявите интеллект и подумайте ... У меня такой глупый вопрос: unpivot можно использовать с динамическим блоком? можно подчеркиваю, Вам не нужен "динамический блок" привожу просто для примера, надеюсь MaximaXXL не обидется надо причесать, так-как ф-ция выполняется для ОДНОЙ строки то god,kod_sotr возможно из PARTITION/order by/group by убрать не убирал, дублировал влоб пример Максима Код: plsql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 14:04 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Elicstax..еще раз динамика СДЕСЬ не нужна, перечислить 51 case не проблемаДа просто ненормализованному горе-дизайнеру ноги повыдёргивать нужно. мне тоже когда-то я делал графік за месяц (на третем формсе ) сотрудник,1-28/30/31 день в одну строку, табельщику удобно было работать с таблицей tn,dat (год.месяц),d1,d2,...,d31 для визуализации а от с tn,dat_tabel (день.год.месяц) геморой был в формсах/репорте ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 14:14 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
stax..Norman94пропущено... У меня такой глупый вопрос: unpivot можно использовать с динамическим блоком? можно подчеркиваю, Вам не нужен "динамический блок" привожу просто для примера, надеюсь MaximaXXL не обидется надо причесать, так-как ф-ция выполняется для ОДНОЙ строки то god,kod_sotr возможно из PARTITION/order by/group by убрать не убирал, дублировал влоб пример Максима Код: plsql 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. Здорово, то что надо, спасибо! Однако я никак не могу понять, куда можно вставить то, чтобы он искал и выявлял интервалы связанные только с "о". Возвращать он должен именно интервалы "о" по типу "01.02; 01.02". То есть как вы сделали. Да, динамику требует начальство, сам бы давно UNPIVOT воспользовался и не парил себе мозги. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 14:52 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94Здорово, то что надо, спасибо! Однако я никак не могу понять, куда можно вставить то, чтобы он искал и выявлял интервалы связанные только с "о". Возвращать он должен именно интервалы "о" по типу "01.02; 01.02". То есть как вы сделали. Да, динамику требует начальство, сам бы давно UNPIVOT воспользовался и не парил себе мозги. дивно, но бог с ними (начальниками) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Запрос MaximaXXL я не рассматриваю (обсуждаю), Вам решать напр я б сортировку cast(ltrim(weeks,'N')as number) добавил в аналитику зы можно (и надо) на ты ...... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 16:36 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
stax..Запрос MaximaXXL я не рассматриваю (обсуждаю), Вам решать напр я б сортировку cast(ltrim(weeks,'N')as number) добавил в аналитику зы можно (и надо) на ты Беда подкралась незаметно - он null выдает Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 17:03 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
stax.., А не, всё норм, это я ступил, забыл раскладку переключить. Вот. Отлично. То, что надо. Спасибо тебе, огромное! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 17:07 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94stax.., А не, всё норм, это я ступил, забыл раскладку переключить. Вот. Отлично. То, что надо. Спасибо тебе, огромное! если нет проверки, код "о" неудачно выбрали, легко спутать с О,0,o,O .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.03.2017, 17:12 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
stax..Norman94stax.., А не, всё норм, это я ступил, забыл раскладку переключить. Вот. Отлично. То, что надо. Спасибо тебе, огромное! если нет проверки, код "о" неудачно выбрали, легко спутать с О,0,o,O .... stax У меня ещё к вам небольшой вопрос. Теперь я пытаюсь преобразовать названия столбцов в дату, чтобы получилось число и месяц начала любой недели. Я подставляю этот рассчёт в эту функцию Код: sql 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. Но он пишет неверное число. В чём может быть дело? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 08:30 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Теперь я немного видоизменил код, но он выдаёт по прежнему как N1, N2 и т.д., а должен как 01.01, 02.01 Код: sql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 09:00 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94Теперь я немного видоизменил код, но он выдаёт по прежнему как N1, N2 и т.д., а должен как 01.01, 02.01 он выдаёт по прежнему как N1, N2 и т.д., а должен как 01.01, 02.01 - ну наверно не заменил в нужном месте =) Я бы если по быстрому заменил бы в корне Код: sql 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. т.е. во внутр селекте выводим не weeks а сразу даты to_char(trunc(to_date(god,'yyyy'),'y')+(cast(ltrim(weeks,'N') as number)-1)*7,'dd.mm') Weeks_D, ну а потом их собираем в диапазоны ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 13:40 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
MaximaXXLNorman94Теперь я немного видоизменил код, но он выдаёт по прежнему как N1, N2 и т.д., а должен как 01.01, 02.01 он выдаёт по прежнему как N1, N2 и т.д., а должен как 01.01, 02.01 - ну наверно не заменил в нужном месте =) Я бы если по быстрому заменил бы в корне Код: sql 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. т.е. во внутр селекте выводим не weeks а сразу даты to_char(trunc(to_date(god,'yyyy'),'y')+(cast(ltrim(weeks,'N') as number)-1)*7,'dd.mm') Weeks_D, ну а потом их собираем в диапазоны Он всё равно выдаёт invalid number ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 13:42 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94, А не, всё правильно, это я чуть тупанул. Ну блин, долго же до этого доходило, аж обидно слегка( Спасибо огромное) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 13:44 |
|
||
|
Поиск по строке
|
|||
|---|---|---|---|
|
#18+
Norman94Norman94, А не, всё правильно, это я чуть тупанул. Ну блин, долго же до этого доходило, аж обидно слегка( Спасибо огромное) Ну а теперь, когда все получилось бери надфилек и начинай выкидывать ненужное =) Код: plsql 1. 2. 3. 4. 5. меняй на Код: plsql 1. 2. 3. и комментируй на будущее cast(... as number) на to_number(...) выкидывание ненужных для твоего случая order ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.03.2017, 14:25 |
|
||
|
|

start [/forum/topic.php?fid=52&gotonew=1&tid=1886259]: |
0ms |
get settings: |
10ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
235ms |
get topic data: |
11ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
1ms |
| others: | 241ms |
| total: | 598ms |

| 0 / 0 |
