|
|
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
Подскажите пожалуйста по запросу, вопроса 2: 1. Как дополнительно вставить значения, кроме значений из выборки ? Т.е. мне нужно кроме перечисленных в начале полей вставить еще одно, с датой (не текущей!). Гугление что-то не дает ответа :( 2. Как в целом реализован запрос, есть ли к чем придраться ? Заранее благодарю! Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 11:33:03 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
korshunТ.е. мне нужно кроме перечисленных в начале полей вставить еще одно, с датой (не текущей!) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. korshun2. Как в целом реализован запрос, есть ли к чем придраться ?Телепаты в отпуске, а мы не в курсе, что этот запрос должен выбирать, откуда и в какие сроки. Ну разве что вместо date_format можно использовать year() и month() - впрочем, на производительности это не скажется -, да вместо кучи OR-ов написать "`p_orders`.`podtype` IN (список значений)". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 12:03:57 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
Подскажите пожалуйста еще по такому моменту: в "основной" таблице для select'a `nktb` и в таблице `p_orders` может быть несколько строк, подходящих под условия выборки. У этих двух таблиц есть одинаковое поле-ссылка на третью таблицу `smetytb`. `nktb` - таблица с оборудованием, которое выписывается на смету `p_orders` - таблица с "деньгами", которые платятся по той же смете, по которой мы выбрали оборудование `smetytb` - сам таблица смет, здесь нам нужна только сумма сметы Соответственно должно происходить следующее: - допустим в нужном месяце есть 2 строки в `nktb`, подходящие под условия выборки, нам нужно выдернуть из них id сметы и суммировать поле, назовем его `price` - далее идем в таблицу `p_orders`, ищем там строки подходящие под условия выборки и с id сметы таким же, как и в предыдущей выборке, и суммируем поля с названием, например `pay` - идем с таблицу `smetytb` и выдергиваем значение поля `smeta_price` с уже выбранным выше id В идеале скрестить это с insert'ом из первого поста. Как-то так, надеюсь понятно объяснил. С утра пытаюсь нечто подобное изобразить, но ничего не получается, мозг уже почти взорвался :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 12:17:15 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
tanglir, спасибо, вариант со вставкой значения в сам SELECT не догадался попробовать! По второму вопросу интересовала сама структура запроса, так же благодарю за комментарий! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 12:20:26 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
korshun, ещё: Код: sql 1. в мускле ЕМНИП работать не будет, используйте concat() korshunв "основной" таблице для select'a `nktb` и в таблице `p_orders` может быть несколько строк, подходящих под условия выборки. У этих двух таблиц есть одинаковое поле-ссылка на третью таблицу `smetytb`вопрос: оборудование-сметы оборудование-заказы заказы-сметы что с чем как связано? Насколько я понимаю, должно быть: заказ (1-1(М?)) смета (1-М) оборудование. Но вы как-то непонятно написали. ЯНП, почему "оборудование" выставлено основной таблицей. Что, есть такое оборудование, которое связано с заказами, но не со сметами? А как, если korshunУ этих двух таблиц есть одинаковое поле-ссылка на третью таблицу `smetytb`? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 12:29:20 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
Делается все так, распишу по пунктам: 1. Создается смета (таблица `smetytb`) на некую сумму, пусть будет 1000 руб. ID сметы пусть будет 1. 2. Клиент может оплатить как всю сумму сразу, так и платить частично. Т.е. сегодня он пришел сам, оплатил наличкой 800 руб., а завтра перевел по безналу оставшиеся 200 руб. На каждый платеж составляется форма и привязывается к нужной смете (таблица `p_orders`), т.е. в данном случае получится 2 записи в таблице `p_orders`, ссылающихся на смету с ID 1. Но оплата может быть не 800+200, а 300+200, то-есть будет долг, для этого и нужна сумма по определенному полю всех записей. 3. Со склада выписывается оборудование (таблица `nktb`) так же на смету из п.1. Чуть позже может быть выписано еще что-то на ту же смету, потом еще и т.д., то-есть получается несколько записей в `nktb`, ссылающихся на `smetytb`.`id` = 1. Тут так же нужна сумма по определенному полю всех записей. В итоге для формирования строки для INSERT'а в таблицу `realiz` нужно получить: а) Сумму взятого оборудования б) Сумму поступивших оплат в) Сумму сметы Таблица `realiz` формируется за предыдущий месяц по данным из таблицы `nktb`. Алгоритм такой: - Идем в `nktb`, ищем записи за 6й месяц (Июнь) - Поле с суммой у записей, у которых поле `nktb`.`idsm` (ссылка на смету) одинаковое, каким-то образом суммируем и далее .. - ... идем в `p_orders`, ищем записи за тот же месяц (6й) и с таким же полем-ссылкой на смету `p_orders`.`idsm`, и так же каким-то образом суммируем поле с суммой - Далее уже выдергивается сумма сметы, остальная информация и осуществляется вставка в таблицу `realiz`. Т.е. через несколько запросов это делается без проблем, но хотелось бы, если есть такая возможность, сделать одним запросом. На всякий случай прикрепляю скрин из phpmyadmin'а ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 13:34:35 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
tanglir, да, спасибо за concat(), даже не заметил, что NULL'и вставляются вместо данных! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 13:35:29 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
Ну вот, у вас оборудование ссылается на смету и заказы тоже ссылаются на смету. Почему тогда смета стоит справа, а оборудование - слева в лефтджойне? Надо либо наоборот, либо вообще должен быть иннерджойн. Подумайте, какой получится результат, если в выбранный период прошли оплаты по сметам, созданным в другой период :) korshunВ итоге для формирования строки для INSERT'а в таблицу `realiz` нужно получить: а) Сумму взятого оборудования б) Сумму поступивших оплат в) Сумму сметы 3)? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. добавить условий по вкусу PS. Получается, в вашей схеме невозможно определить, оплачено ли конкретное оборудование, если смете соответствует несколько единиц оборудования и она оплачена не полностью. Я правильно понимаю? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 13:47:41 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
Смета сама по себе тут вообще не при чем, смета может присутствовать в таблице `smetytb` без всяких "движений" по ней. Таблица `realiz` формируется на основании либо оплат (данных из `p_orders`), либо на основании взятого оборудования (таблица `nktb`) за предыдущий месяц. Получается даже так (не отразил это в предыдущем посте), что нужно одновременно делать выборку и из `nktb`, и из `p_orders` - это можно сделать с помощью INNER JOIN, верно ? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Результат на картинке Но остается открытым вопрос, как в этом же запросе сосчитать сумму и по нескольким записям в `nktb`, и по нескольким записям в `p_orders` (в примере повторяющиеся записи выпали в `p_orders`) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 14:09:19 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
UPD. То, что на картинке ordnum у выделенный строк одинаковые - это баг: правил записи руками, не обратил внимания. Они разными на самом деле должны быть, т.е. 9 и 11 например ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 14:11:21 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
C INNER JOIN я конечно погорячился :) Совсем голова уже не соображает :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 14:29:38 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
korshunСмета сама по себе тут вообще не при чем, смета может присутствовать в таблице `smetytb` без всяких "движений" по ней.Ещё раз: у вас и в оборудовании, и в оплатах присутствуют ссылки на таблицу смет. Эти поля могут быть NULL или нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 16:59:28 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
tanglirkorshunСмета сама по себе тут вообще не при чем, смета может присутствовать в таблице `smetytb` без всяких "движений" по ней. Ещё раз: у вас и в оборудовании, и в оплатах присутствуют ссылки на таблицу смет. Эти поля могут быть NULL или нет? Могут, но выборку нужно делать только для тех записей с обоих таблицах, где эта ссылка не NULL На данный момент ничего лучшего придумать не смог. Код: 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. Выбирает, вроде, то, что надо, но как сосчитать сумму полей в строках, где ссылка на смету одинаковая, но разные номера и убрать дубликаты - хоть убей не понимаю :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2014, 18:22:02 |
|
||
|
INSERT + SELECT + пользовательские значения
|
|||
|---|---|---|---|
|
#18+
korshunМогут, но выборку нужно делать только для тех записей с обоих таблицах, где эта ссылка не NULL korshunно как сосчитать сумму полей в строках, где ссылка на смету одинаковая, но разные номера и убрать дубликаты - хоть убей не понимаю :( Ещё раз внимательно читайте мой запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2014, 05:20:32 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=38693587&tid=1834529]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
66ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
| others: | 239ms |
| total: | 419ms |

| 0 / 0 |
