|
|
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
Добрый день. Имеется самописная биллинг система, которая досталась мне по наследству. И сейчас требуется сделать выборку для 1С, из этого биллинга. Начну с данных которые имеются. TABLE clife - основная таблица описывающая услуги предоставляемые абоненту, варианты оплаты итд. cid int4 -- Лицевой счет dton date -- это первый день, когда запись вступила в силу (информация содержащаяся в этой записи стала актуальной) dtoff date -- последний день "жизни" записи tid int4 -- ИД тэга из таблицы tags: идентифицирует что именно описано в поле value данной записи value text -- значение тэга, конкретная информация на тему tid TABLE dylog - суммарная информация из таблицы log за каждый день по каждой услуге для каждого абонента. dt date -- дата предоставления услуги sid int4 -- идентификатор услуги: её ИД, либо nick-name cid int4 -- ЛС абонента cnt int4 -- количество записей для данных dt, sid, cid qnt bnum -- объём предоставленной услуги в тарификационных единицах cost bnum -- стоимость в "попугаях" Небольшой набор данных, для примера, которые имеются в этих таблицах. clife: Код: 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. 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. dylog: Код: 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. Данные для моего вопроса, требуются не все, которые я дал. Из всего, что я дал, нужно выбрать cid,sid,cost (ЛС, id услуги и стоимость соответственно) из таблицы dylog, за текущую дату и стоимостью не равную нулю. Это нужно, для выгрузки начисления в 1С. С этим проблем не возникает, например: Код: sql 1. 2. 3. 4. 5. 6. 7. А дальше начинается интересней. Дело в том, что, один лицевой счет может являться плательщиком у другого. В моем примере, это ЛС 1425, который является плательщиком у счетов 1564 и 303. Об этом свидетельствует запись в выборке из таблицы clife: Код: sql 1. 2. 3. 4. 5. Т.е. за ЛС 1564 платит ЛС 1425. Другими словами, списание плат, за услуги, которые предоставляются для ЛС 1564, производится с ЛС 1425. Теперь самое сложное, верно сформулировать, что мне нужно... А нужно следующие: Выбрать начисления из таблицы dylog для каждого ЛС. Но при этом, если у данного ЛС (например 1564), плательщиком является другой ЛС (1425), то в результате выборке указывать ЛС плательщика. Пример вывода: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. В этой выборке, первые 3 строки, для ЛС 1425, следующие 2, для ЛС 303, далее 3 строки для ЛС 1564 и последние 3 ЛС 1155. В выборке не указаны счета 303 и 1564, т.к. плательщиком у них является 1425, соответственно он и указан. Так же, идеально было бы, если бы, одинаковые sid, для одного и того же ЛС в выборке, группировались, а cost суммировался. Т.е получился бы примерно следующий вывод: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. Тут мы сгруппировали sid'ы 2, 20 и 25, а их cost суммировали. Надеюсь, я все понятно расписал. Но если возникнут вопросы, то задавайте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 09:29 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
KsenZ, (Прошу прощения за пустое сообщение.) Какова максимальная глубина наследования счетов? В вашем примере может быть, что: - 1564 платит за 5678 - 1425 платит за 1564 и, по наследству, еще и за 5678 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 10:31 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
vyegorovKsenZ, (Прошу прощения за пустое сообщение.) Какова максимальная глубина наследования счетов? В вашем примере может быть, что: - 1564 платит за 5678 - 1425 платит за 1564 и, по наследству, еще и за 5678 ? Нет. 1425 платит за себя, и может платить еще за несколько счетов, например за 1564 и 303. Но на этом все, ни 1564 ни 303 не могут платить за кого то еще. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 10:40 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
KsenZНет. 1425 платит за себя, и может платить еще за несколько счетов, например за 1564 и 303. Но на этом все, ни 1564 ни 303 не могут платить за кого то еще.Вы не можете присоединить таблицу саму к себе по LEFT JOIN и в списке полей секции SELECT заменить "пустышки" из левоприсоединенной копии таблицы на данные лицевых счетов из основной? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 10:58 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
KsenZ, если что, читать про [LEFT | RIGHT] outer join, про coalesce / case ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 10:59 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
KsenZНет. 1425 платит за себя, и может платить еще за несколько счетов, например за 1564 и 303. Но на этом все, ни 1564 ни 303 не могут платить за кого то еще.То есть 1425 головной контрагент. Но эти связи где-то должны быть прописаны - может есть другая таблица, содержащая эти связи? И уже от этого плясать. Ну или из 1С тогда забирать данные справочника Контрагенты 1С (там уже эта связь контрагент-головной контрагент скорее всего прописана) и по этой связи из 1С связывать оплаты. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 11:25 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
Владимир ЛазуркоKsenZНет. 1425 платит за себя, и может платить еще за несколько счетов, например за 1564 и 303. Но на этом все, ни 1564 ни 303 не могут платить за кого то еще.То есть 1425 головной контрагент. Но эти связи где-то должны быть прописаны - может есть другая таблица, содержащая эти связи? И уже от этого плясать. Ну или из 1С тогда забирать данные справочника Контрагенты 1С (там уже эта связь контрагент-головной контрагент скорее всего прописана) и по этой связи из 1С связывать оплаты. Да, как я писал выше, эти связи видно в таблице clife. Например: Код: sql 1. 2. 3. 4. 5. Т.е. cid - это текущий ЛС, tid - идентификатор, значение 1, как раз, и означает, что он не сам платит, value - соответственно ЛС плательщика. У ЛС, которые платять сами за себя, такой строки с tid=1 в таблице нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 11:46 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
KsenZ, ок. А я говорю о связях, которы еидентифицируют, за кого 1425 может платить, а за кого нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 12:28 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
KsenZ, Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. это надо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 12:50 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
Владимир ЛазуркоKsenZ, ок. А я говорю о связях, которы еидентифицируют, за кого 1425 может платить, а за кого нет. Это делается в обратном направлении, если так можно сказать. 1564 смотрит в таблице clife, есть ли у него tid=1, т.е. сам ли он оплачивает услуги, или нет. Если tid имеется, то смотрит в value значение ЛС плательщика. И за услуго, списываются средства с ЛС плательщика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 12:51 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
KsenZУ ЛС, которые платять сами за себя, такой строки с tid=1 в таблице нет. то есть так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 12:53 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
roadsterKsenZУ ЛС, которые платять сами за себя, такой строки с tid=1 в таблице нет. то есть так Код: sql 1. 2. 3. ERROR: COALESCE types text and integer cannot be matched ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 19:29 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
KsenZERROR: COALESCE types text and integer cannot be matchedпочитать про преобразование типов: ::, cast, to_number ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2015, 20:09 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
KsenZroadsterпропущено... то есть так Код: sql 1. 2. 3. ERROR: COALESCE types text and integer cannot be matchedда уж... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. примерно как-то так. кстати, я тут подумал... а вы не боитесь выставить суммы за весь период времени, по которому есть данные? думаю плтельщики будут не в восторге. ЗЫ а судя по вашим вопросам вы таки можете выдать ошеломляющие цифры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2015, 10:11 |
|
||
|
Не простая выборка.
|
|||
|---|---|---|---|
|
#18+
roadsterKsenZпропущено... ERROR: COALESCE types text and integer cannot be matchedда уж... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. примерно как-то так. кстати, я тут подумал... а вы не боитесь выставить суммы за весь период времени, по которому есть данные? думаю плтельщики будут не в восторге. ЗЫ а судя по вашим вопросам вы таки можете выдать ошеломляющие цифры. Такая же ошибка. Преобразовать нужно не cost, а value , т.к.у этого столбца тип text. Побывал сделать CAST(c.value AS NUMBER) но эффекта это не дало. ERROR: type "number" does not exist LINE 1: ...st) as cost from (select COALESCE(CAST(c.value AS NUMBER),d... По поводу того, что насчитаю много, то этого не будет, т.к. выборка будет только за текущий день, нечто вроде AND dt='2015-11-27' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2015, 10:38 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39113820&tid=1997606]: |
0ms |
get settings: |
8ms |
get forum list: |
21ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
234ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 610ms |

| 0 / 0 |
