Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSERT + SELECT + пользовательские значения / 15 сообщений из 15, страница 1 из 1
10.07.2014, 11:33:03
    #38692874
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
Подскажите пожалуйста по запросу, вопроса 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.
INSERT INTO `realiz`
	(`workmonth`, `smrursumm`, `nkoborsumm`, `worksumm`, `division1`, `idsm`, `smnum`, `smarndsumm`, `smarndmonth`, `smarnditogo`, `clname`, `objid`, `objnum`, `objaddress`, `idmontazh`, `debt`)  
SELECT 
    `nktb`.`crdate` AS `nkmonth`,
    `smetytb`.`rursum` AS `smsumm`,
    `nktb`.`nksummout` AS `nksumm`,
    (`smetytb`.`rursum` - `nktb`.`nksummout`) AS `worksumm`,
    `p_orders`.`itogo` AS `paysumm`,
    `smetytb`.`id` AS `smid`,
    `smetytb`.`smnum` AS `smnum`,
    IF(`smetytb`.`arnd` = '0', NULL, `smetytb`.`arndcost`) AS `smarndcost`,
    IF(`smetytb`.`arnd` = '0', NULL, `smetytb`.`arndmnth`) AS `smarndmnth`,
    IF(`smetytb`.`arnd` = '0', NULL, `smetytb`.`arnditsum`) AS `smarndsumm`,
    `clients`.`clname` AS `clname`,
    `objects`.`id` AS `objid`,
    (`objects`.`objnum` + '\\' + `objects`.`id`) AS `objnum`,
    IF(`objects`.`objapartaments` IS NULL, 
       `city`.`city` + ', ' + `street`.`street` + ' ' + `objects`.`objhouse` + '-' + `objects`.`objapartaments`, 
       `city`.`city` + ', ' + `street`.`street` + ' ' + `objects`.`objhouse`) AS `objaddress`,
    `objects`.`objmontazh` AS `montazhid`,
    (`smetytb`.`rursum` - IF(`p_orders`.`itogo` IS NULL, 0, `p_orders`.`itogo`)) AS `debt`
FROM `nktb`
LEFT JOIN `objects` ON `objects`.`id` = `nktb`.`nkobjid`
LEFT JOIN `clients` ON `clients`.`id` = `objects`.`objidcl`
LEFT JOIN `city` ON `city`.`id` = `objects`.`objcity`
LEFT JOIN `street` ON `street`.`id` = `objects`.`objstreet`
LEFT JOIN `smetytb` ON `smetytb`.`id` = `nktb`.`nkidsm`
LEFT JOIN `p_orders` ON `p_orders`.`idsm` = `nktb`.`nkidsm`
				AND DATE_FORMAT(`p_orders`.`cr_date`,'%c') = '6' 
                                AND DATE_FORMAT(`p_orders`.`cr_date`,'%Y') = '2014'
                                AND (`p_orders`.`podtype` = '7'
                                  OR `p_orders`.`podtype` = '9'
                                  OR `p_orders`.`podtype` = '11'
                                  OR `p_orders`.`podtype` = '14'
                                  OR `p_orders`.`podtype` = '18'
                                  OR `p_orders`.`podtype` = '19'
                                  OR `p_orders`.`podtype` = '25')
WHERE `nktb`.`nksummin` IS NULL
  AND DATE_FORMAT(`nktb`.`crdate`,'%c') = '6' 
  AND DATE_FORMAT(`nktb`.`crdate`,'%Y') = '2014'
  AND (`nktb`.`nkindgr` = '9'
   OR `nktb`.`nkindgr` = '47'
   OR `nktb`.`nkindgr` = '68')


...
Рейтинг: 0 / 0
10.07.2014, 12:03:57
    #38692933
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
korshunТ.е. мне нужно кроме перечисленных в начале полей вставить еще одно, с датой (не текущей!)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
INSERT INTO 
<...>
SELECT 
    `nktb`.`crdate` AS `nkmonth`,
   <...>,
    (`smetytb`.`rursum` - IF(`p_orders`.`itogo` IS NULL, 0, `p_orders`.`itogo`)) AS `debt`,
   '2014-07-10' as ещё_одно_поле
FROM `nktb`
<...>


korshun2. Как в целом реализован запрос, есть ли к чем придраться ?Телепаты в отпуске, а мы не в курсе, что этот запрос должен выбирать, откуда и в какие сроки. Ну разве что вместо date_format можно использовать year() и month() - впрочем, на производительности это не скажется -, да вместо кучи OR-ов написать "`p_orders`.`podtype` IN (список значений)".
...
Рейтинг: 0 / 0
10.07.2014, 12:17:15
    #38692961
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
Подскажите пожалуйста еще по такому моменту: в "основной" таблице для select'a `nktb` и в таблице `p_orders` может быть несколько строк, подходящих под условия выборки. У этих двух таблиц есть одинаковое поле-ссылка на третью таблицу `smetytb`.
`nktb` - таблица с оборудованием, которое выписывается на смету
`p_orders` - таблица с "деньгами", которые платятся по той же смете, по которой мы выбрали оборудование
`smetytb` - сам таблица смет, здесь нам нужна только сумма сметы

Соответственно должно происходить следующее:
- допустим в нужном месяце есть 2 строки в `nktb`, подходящие под условия выборки, нам нужно выдернуть из них id сметы и суммировать поле, назовем его `price`
- далее идем в таблицу `p_orders`, ищем там строки подходящие под условия выборки и с id сметы таким же, как и в предыдущей выборке, и суммируем поля с названием, например `pay`
- идем с таблицу `smetytb` и выдергиваем значение поля `smeta_price` с уже выбранным выше id
В идеале скрестить это с insert'ом из первого поста.

Как-то так, надеюсь понятно объяснил. С утра пытаюсь нечто подобное изобразить, но ничего не получается, мозг уже почти взорвался :(
...
Рейтинг: 0 / 0
10.07.2014, 12:20:26
    #38692971
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
tanglir, спасибо, вариант со вставкой значения в сам SELECT не догадался попробовать!
По второму вопросу интересовала сама структура запроса, так же благодарю за комментарий!
...
Рейтинг: 0 / 0
10.07.2014, 12:29:20
    #38692995
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
korshun, ещё:
Код: sql
1.
`city`.`city` + ', ' + `street`.`street`

в мускле ЕМНИП работать не будет, используйте concat()

korshunв "основной" таблице для select'a `nktb` и в таблице `p_orders` может быть несколько строк, подходящих под условия выборки. У этих двух таблиц есть одинаковое поле-ссылка на третью таблицу `smetytb`вопрос:
оборудование-сметы
оборудование-заказы
заказы-сметы
что с чем как связано?
Насколько я понимаю, должно быть: заказ (1-1(М?)) смета (1-М) оборудование. Но вы как-то непонятно написали.
ЯНП, почему "оборудование" выставлено основной таблицей. Что, есть такое оборудование, которое связано с заказами, но не со сметами? А как, если korshunУ этих двух таблиц есть одинаковое поле-ссылка на третью таблицу `smetytb`?
...
Рейтинг: 0 / 0
10.07.2014, 13:34:35
    #38693126
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
Делается все так, распишу по пунктам:
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'а
...
Рейтинг: 0 / 0
10.07.2014, 13:35:29
    #38693128
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
tanglir, да, спасибо за concat(), даже не заметил, что NULL'и вставляются вместо данных!
...
Рейтинг: 0 / 0
10.07.2014, 13:47:41
    #38693156
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
Ну вот, у вас оборудование ссылается на смету и заказы тоже ссылаются на смету. Почему тогда смета стоит справа, а оборудование - слева в лефтджойне? Надо либо наоборот, либо вообще должен быть иннерджойн.
Подумайте, какой получится результат, если в выбранный период прошли оплаты по сметам, созданным в другой период :)

korshunВ итоге для формирования строки для INSERT'а в таблицу `realiz` нужно получить:
а) Сумму взятого оборудования
б) Сумму поступивших оплат
в) Сумму сметы
3)?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
select id
 ,t1.q
 ,t2.q
 ,rursum
from smetytb s
left join (
 select nkidsm,sum(nksummout) q from nktb
) t1 on s.id=t1.nkidsm
left join (
select idsm,sum(itogo) q from p_orders
) t2 on s.id=t2.idsm

добавить условий по вкусу

PS. Получается, в вашей схеме невозможно определить, оплачено ли конкретное оборудование, если смете соответствует несколько единиц оборудования и она оплачена не полностью. Я правильно понимаю?
...
Рейтинг: 0 / 0
10.07.2014, 14:09:19
    #38693197
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
Смета сама по себе тут вообще не при чем, смета может присутствовать в таблице `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.
SELECT 
	`nktb`.`nknum` AS `nknum`,
	`nktb`.`nksummout` AS `nksumm`,
	`p_orders`.`ordnum` AS `ordnum`,
	`p_orders`.`itogo` AS `paysumm`,
	`smetytb`.`smnum` AS `smnum`,
	`smetytb`.`rursum` AS `smsumm`
FROM `nktb` 
INNER JOIN `p_orders` ON `p_orders`.`idsm` = `nktb`.`nkidsm`
			AND DATE_FORMAT(`p_orders`.`cr_date`,'%c') = '6' 
                    	AND `p_orders`.`podtype` IN ('7', '9', '11', '14', '18', '19', '25')
LEFT JOIN `smetytb` ON `smetytb`.`id` = `nktb`.`nkidsm`
WHERE `nktb`.`nksummin` IS NULL
  AND `nktb`.`nkidsm` IS NOT NULL
  AND DATE_FORMAT(`nktb`.`crdate`,'%c') = '6' 
  AND DATE_FORMAT(`nktb`.`crdate`,'%Y') = '2014'
  AND `nktb`.`nkindgr` IN ('9', '47', '68')



Результат на картинке
Но остается открытым вопрос, как в этом же запросе сосчитать сумму и по нескольким записям в `nktb`, и по нескольким записям в `p_orders` (в примере повторяющиеся записи выпали в `p_orders`)
...
Рейтинг: 0 / 0
10.07.2014, 14:11:21
    #38693202
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
UPD. То, что на картинке ordnum у выделенный строк одинаковые - это баг: правил записи руками, не обратил внимания. Они разными на самом деле должны быть, т.е. 9 и 11 например
...
Рейтинг: 0 / 0
10.07.2014, 14:29:38
    #38693239
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
C INNER JOIN я конечно погорячился :) Совсем голова уже не соображает :(
...
Рейтинг: 0 / 0
10.07.2014, 16:59:28
    #38693587
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
korshunСмета сама по себе тут вообще не при чем, смета может присутствовать в таблице `smetytb` без всяких "движений" по ней.Ещё раз: у вас и в оборудовании, и в оплатах присутствуют ссылки на таблицу смет. Эти поля могут быть NULL или нет?
...
Рейтинг: 0 / 0
10.07.2014, 18:22:02
    #38693705
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
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.
SELECT
            `smetytb`.`id` AS `SMID`,
            `smetytb`.`smnum` AS `smnum`,
            `smetytb`.`rursum` AS `smsumm`,
            `nktb`.`crdate` AS `nkcrdate`,
            `nktb`.`nkidsm` AS `NKIDSM`,
            `nktb`.`nknum` AS `nknum`,
            `nktb`.`nksummout` AS `nksumm`,
            `p_orders`.`cr_date` AS `ordcrdate`,
            `p_orders`.`idsm` AS `ORDIDSM`,
            `p_orders`.`ordnum` AS `ordnum`,
            `p_orders`.`itogo` AS `paysumm`
    FROM `nktb`
    LEFT JOIN `p_orders` ON `p_orders`.`idsm` = `nktb`.`nkidsm`
    	AND DATE_FORMAT(`p_orders`.`cr_date`,'%c') = '6'
        AND DATE_FORMAT(`p_orders`.`cr_date`,'%Y') = '2014'
        AND `p_orders`.`podtype` IN ('7', '9', '11', '14', '18', '19', '25')
    LEFT JOIN `smetytb` ON `smetytb`.`id` = `nktb`.`nkidsm`
    WHERE `nktb`.`nksummin` IS NULL
        AND `nktb`.`nkidsm` IS NOT NULL
        AND DATE_FORMAT(`nktb`.`crdate`,'%c') = '6'
        AND DATE_FORMAT(`nktb`.`crdate`,'%Y') = '2014'
        AND `nktb`.`nkindgr` IN ('9', '47', '68')
        
UNION

SELECT
           `smetytb`.`id` AS `SMID`,
            `smetytb`.`smnum` AS `smnum`,
            `smetytb`.`rursum` AS `smsumm`,
            `nktb`.`crdate` AS `nkcrdate`,
            `nktb`.`nkidsm` AS `NKIDSM`,
            `nktb`.`nknum` AS `nknum`,
            `nktb`.`nksummout` AS `nksumm`,
            `p_orders`.`cr_date` AS `ordcrdate`,
            `p_orders`.`idsm` AS `ORDIDSM`,
            `p_orders`.`ordnum` AS `ordnum`,
            `p_orders`.`itogo` AS `paysumm`
    FROM `p_orders`
    LEFT JOIN `nktb` ON `nktb`.`nkidsm` = `p_orders`.`idsm`
    	AND DATE_FORMAT(`nktb`.`crdate`,'%c') = '6'
        AND DATE_FORMAT(`nktb`.`crdate`,'%Y') = '2014'
        AND `nktb`.`nkindgr` IN ('9', '47', '68')
    LEFT JOIN `smetytb` ON `smetytb`.`id` = `p_orders`.`idsm`
    WHERE `p_orders`.`idsm` IS NOT NULL
        AND DATE_FORMAT(`p_orders`.`cr_date`,'%c') = '6'
        AND DATE_FORMAT(`p_orders`.`cr_date`,'%Y') = '2014'
        AND `p_orders`.`podtype` IN ('7', '9', '11', '14', '18', '19', '25')



Выбирает, вроде, то, что надо, но как сосчитать сумму полей в строках, где ссылка на смету одинаковая, но разные номера и убрать дубликаты - хоть убей не понимаю :(
...
Рейтинг: 0 / 0
11.07.2014, 05:20:32
    #38693934
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
korshunМогут, но выборку нужно делать только для тех записей с обоих таблицах, где эта ссылка не NULL
korshunно как сосчитать сумму полей в строках, где ссылка на смету одинаковая, но разные номера и убрать дубликаты - хоть убей не понимаю :(
Ещё раз внимательно читайте мой запрос.
...
Рейтинг: 0 / 0
11.07.2014, 08:00:35
    #38693958
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
INSERT + SELECT + пользовательские значения
tanglirЕщё раз внимательно читайте мой запрос.
Да, извиняюсь, вчера видимо думалка совсем не работала, сегодня на свежую голову стало понятно, что вы предлагаете :) Благодарю!
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / INSERT + SELECT + пользовательские значения / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]