Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Склеить 2 строки в подзапросе / 25 сообщений из 28, страница 1 из 2
08.07.2016, 17:04
    #39270787
superbalbes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
Есть такой запрос при выборке материалов из таблицы для формирования файла в Excel. И при выборке тонировки с 2х сторон вылетает ошибка. Можно как-нибудь "склеить" 2 строки подзапроса (PL) в 1 строку?

Код: 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.
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.
select
cast(SUM(itd.qty) as varchar(15)) as summa
, k.name as contragent
, o.orderid
, o.agreementno || '/' || oi.name || '/'  || itd.modelno || '/' ||  itd.izdpart
, go.name as NomRaskr                                             
, cast(oi.qty as varchar(15)) as sumizd
, case when gg.ggtypeid <> 18 then
    (
    select distinct itemsdetail.int_marking
    from itemsdetail
    join  groupgoods on groupgoods.grgoodsid = itemsdetail.grgoodsid
    where itemsdetail.orderitemsid =oi.orderitemsid
    and   itemsdetail.modelno =itd.modelno
    and   itemsdetail.izdpart =itd.izdpart
    and   groupgoods.ggtypeid = 18
    ) else itd.int_marking end as formula 
, gg.name
, gg.grgoodsid    
, g.marking as art
, g.marking2 as art2
 , case when gg.ggtypeid = 51 then
    (
    select distinct itemsdetail.width
    from itemsdetail
    join groupgoods  on groupgoods.grgoodsid = itemsdetail.grgoodsid
    where itemsdetail.orderitemsid =oi.orderitemsid
    and itemsdetail.modelno =itd.modelno
    and itemsdetail.izdpart =itd.izdpart
    and groupgoods.ggtypeid = 18
    ) else itd.width end as width 

 , case when gg.ggtypeid = 51 then
    (
    select distinct
    itemsdetail.height
    from itemsdetail
    join groupgoods  on groupgoods.grgoodsid = itemsdetail.grgoodsid
    where itemsdetail.orderitemsid =oi.orderitemsid
    and itemsdetail.modelno =itd.modelno
    and itemsdetail.izdpart =itd.izdpart
    and groupgoods.ggtypeid = 18
    ) else itd.height end as height 
, itd.thick
, oi.rcomment as komment
, gg.ggtypeid as tipem

/*Тонировка начало*/

, case when gg.ggtypeid <> 20 then
   (
    select
     distinct goods.marking
    from itemsdetail
    join goods  on goods.goodsid = itemsdetail.goodsid
    join groupgoods  on groupgoods.grgoodsid = itemsdetail.grgoodsid
    where itemsdetail.orderitemsid =oi.orderitemsid
    and itemsdetail.modelno =itd.modelno
    and itemsdetail.izdpart =itd.izdpart
    and groupgoods.ggtypeid = 20
    ) end as PL

/*Тонировка конец*/

   , case when gg.ggtypeid <> 63 then
    (
    select distinct goods.marking
    from itemsdetail
    join goods  on goods.goodsid = itemsdetail.goodsid
    join groupgoods  on groupgoods.grgoodsid = itemsdetail.grgoodsid
    where itemsdetail.orderitemsid =oi.orderitemsid
    and itemsdetail.modelno =itd.modelno
    and itemsdetail.izdpart =itd.izdpart
    and groupgoods.ggtypeid = 63
    ) end as Paskl  
  , case when gg.ggtypeid <> 16 then
    (
    select distinct groupgoods.name
    from itemsdetail
    join groupgoods on groupgoods.grgoodsid = itemsdetail.grgoodsid
    where itemsdetail.orderitemsid =oi.orderitemsid
    and itemsdetail.modelno =itd.modelno
    and itemsdetail.izdpart =itd.izdpart
    and groupgoods.ggtypeid = 16
    ) end as falsh 
 from itemsdetail itd, itemsdetail itd_SP
     join orderitems oi on (oi.orderitemsid=itd.orderitemsid)
     join orders o on (o.orderid = oi.orderid)
     join customers c on (c.customerid = o.customerid)
     join contragents k on (k.contragid = c.contragid)
     join groupgoods gg on (gg.grgoodsid=itd.grgoodsid)
     join goods g on (g.goodsid=itd.goodsid)
     join GRORDERSDETAIL god on god.orderitemsid = itd.orderitemsid
     join grorders go on go.grorderid = god.grorderid 
where
go.grorderid in (10414)
/* --itd.orderitemsid =:orderitemsid
--and itd.modelno  =:modelno
--and itd.izdpart  =:izdpart
--and itd.updatestatus <> 3 and itd.childid is null */
and itd.orderitemsid = itd_SP.orderitemsid
and itd.modelno = itd_SP.modelno
and o.orderid not in (102606)
--102568,102554,102610,102597,
and gg.ggtypeid in (18,51)
group by
k.name
, o.orderid  
, o.agreementno  
, oi.orderitemsid
, oi.name
, oi.qty
, gg.ggtypeid    
, itd.int_marking
, itd.modelno
, itd.izdpart
, gg.name
, gg.grgoodsid
, g.marking
, g.marking2
, itd.width
, itd.height
, itd.thick
, go.name    
, oi.rcomment
, 18
, itd.grgoodsid
order by
o.agreementno,oi.name, itd.modelno, itd.izdpart desc
...
Рейтинг: 0 / 0
08.07.2016, 17:12
    #39270792
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
Hello, Superbalbes!
You wrote on 8 июля 2016 г. 17:12:16:

Superbalbes> И при выборке тонировки с 2х сторон вылетает ошибка.куда?

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.07.2016, 17:16
    #39270795
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
superbalbes,

Ошибка-то какая?
...
Рейтинг: 0 / 0
08.07.2016, 17:20
    #39270799
superbalbes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
multiple rows in singleton select
...
Рейтинг: 0 / 0
08.07.2016, 17:26
    #39270802
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
разбирать твой запрос лень.
для определения "проблемного" куска
последовательно закомментируй фрагменты запроса,
пока не найдёшь нужный кусок.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.07.2016, 17:30
    #39270808
superbalbes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
Проблемный кусок я выделил - это Тонировка, когда тонировка с одной стороны стеклопакета - ошибки нет, если с обеих сторон - выходит вышеуказанная ошибка. Я понимаю почему (в подзапросе должно быть только одно значение, а если тонировка с обех сторон, то получается 2 значения. это не касается когда тонировка одинаковая), но не знаю как как объединить, если их больше одного. Объединение таблицы с самой собой тоже выдаёт ту же ошибку.
...
Рейтинг: 0 / 0
08.07.2016, 17:32
    #39270809
superbalbes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
в тексте запроса проблемное место место выделено комментариями /*Тонировка начало*/ и /*Тонировка конец*/
...
Рейтинг: 0 / 0
08.07.2016, 17:36
    #39270811
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
superbalbes,

LIST() туда воткни.
...
Рейтинг: 0 / 0
08.07.2016, 17:39
    #39270815
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
superbalbes> в тексте запроса проблемное место место выделено

select first 1 goods.marking

Ну или ищи почему много строк возвращается.

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.07.2016, 17:40
    #39270820
miwaonline
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
superbalbes,

Возможно, тебе вместо select distinct goods.marking надо что-то типа select list(goods.marking) ?

З.Ы. В запрос не вникал.
...
Рейтинг: 0 / 0
08.07.2016, 17:40
    #39270822
superbalbes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
спасибо, ща поробую
...
Рейтинг: 0 / 0
08.07.2016, 17:41
    #39270823
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
Гаджимурадов Рустам,

У него похоже FIRST 1 только одну сторону из 2-х сторонней тонировки выдаст. А вот LIST() как раз склеит обе в одну строку через разделитель.
...
Рейтинг: 0 / 0
08.07.2016, 17:48
    #39270829
superbalbes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
как ни жаль, но у меня Firebird 2.0, а там list() нереализован по ещё.
...
Рейтинг: 0 / 0
08.07.2016, 17:57
    #39270830
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
сделай вместо одного подзапроса два.
будет 2 поля вместо одного.
для каждой стороны тонировки.
если не можешь различить стороны,
дёргай в первом подзапросе MIN()
а в другом MAX()
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.07.2016, 18:27
    #39270839
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
DarkMaster> только одну сторону из 2-х сторонней тонировки выдаст

Я в запрос вообще не вникал, ну его нафик.
Если советовать сделать по-человечески -
лучше уж совсем запрос разбить/переписать.
Чем меньше монструозности, тем лучше.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
08.07.2016, 19:19
    #39270859
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
Гаджимурадов Рустам,

будто я вникал - присоветовал подходящее по смыслу решение
...
Рейтинг: 0 / 0
08.07.2016, 19:34
    #39270868
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
Гаджимурадов РустамDarkMaster> только одну сторону из 2-х сторонней тонировки выдаст

Я в запрос вообще не вникал, ну его нафик.
Если советовать сделать по-человечески -
лучше уж совсем запрос разбить/переписать.
Чем меньше монструозности, тем лучше.


Кстати о грустном - живет у меня в базе процерка, которая дает около миллиона фетчей. Родилась в результате использования других процедур (там всякая бизнес логика).С одной стороны понимаю, что лучше ее переписать нафиг для ускорения, с другой - реально монстр получится, в котором через месяц уже никто не разберется, даже если каждую строку откомментарить. Так и живем.
...
Рейтинг: 0 / 0
08.07.2016, 19:51
    #39270875
Гаджимурадов Рустам
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
DarkMasterКстати о грустном - живет у меня в базе процерка, которая дает около миллиона фетчей.
Область какая, учет, биллинг?

DarkMasterРодилась в результате использования других процедур (там всякая бизнес логика).С одной стороны понимаю, что лучше ее переписать нафиг для ускорения, с другой - реально монстр получится, в котором через месяц уже никто не разберется, даже если каждую строку откомментарить.
Едва ли тут можно что-то тебе посоветовать, не зная деталей.
Есть 2 конца - "не навреди; работает - не трожь" и другой а-ля
"стремление к совершенству повышать эффективность".
Вот где-то между ними и надо искать золотую середину.
Если у тебя есть задачи поважнее/посрочнее (уверен, что есть) -
ну так не трогай, пока не жмёт. Если жмёт - вопрос бы не стоял.
Хотя миллион фетчей в цепочке ХП - пованивает, конечно, я
бы поставил в очередь "на после дедлайна".

P.S. У меня в одной БД (не своей) было аналогичное - сколько
там миллионов фетчилось я даже не считал, но общий расчёт
длился несколько минут, а иногда и больше. Особо сильно не
напрягало, ибо операция относительно редкая была. Но когда
понадобилось часто получать другие данные, которые авторы
(видимо из лени) получали из результатов этой процедуры
(там было что-то вроде 10-15% от исходных 100%) - напрягло
очень сильно, написал "копию", которая считала всё напрямую
и работала на несколько порядков быстрее. Может и тебе стоит
подумать о том, чтобы отстроить рядом новый домик, пока
старая халупа не рухнула...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.07.2016, 16:04
    #39271850
superbalbes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
Гаджимурадов РустамDarkMasterКстати о грустном - живет у меня в базе процерка, которая дает около миллиона фетчей.
Область какая, учет, биллинг?


Это обработка для импорта заготовок для резки стекла из одной программы в другую. Попробую с Min и Max, придётся ещё и сложением строк воспользоваться. Жаль, что LIST не реализован в этой версии, а то 70% из этого запроса уложилось бы в этот LIST.
...
Рейтинг: 0 / 0
11.07.2016, 16:59
    #39271906
superbalbes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
Через Min() Max() получилось. Но не дай бог, если кому-то в голову взбредёт на стеклопакет из 3х стёкол на внутреннее стекло тонировку поставить.
...
Рейтинг: 0 / 0
11.07.2016, 17:14
    #39271917
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
superbalbes, а прогнать тонировку в FOR SELECT и склеить в переменной не судьба?
...
Рейтинг: 0 / 0
11.07.2016, 17:23
    #39271930
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
rdb_dev,

+ звать как подселект из процедуры.
...
Рейтинг: 0 / 0
11.07.2016, 17:28
    #39271939
rdb_dev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
DarkMaster, точно так! Еще можно весь селект ТС'а засунуть в ХП, разбив на два запроса FOR SELECT, чтобы внутренним FOR SELECT была тонировка.
...
Рейтинг: 0 / 0
11.07.2016, 17:31
    #39271943
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
rdb_dev,

Смотри совет Рустама выше. Советам про LIST() вышел обломинго, т.к. у ТС 2.0 еще работает.
...
Рейтинг: 0 / 0
13.07.2016, 11:18
    #39272898
superbalbes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Склеить 2 строки в подзапросе
rdb_devDarkMaster, точно так! Еще можно весь селект ТС'а засунуть в ХП, разбив на два запроса FOR SELECT, чтобы внутренним FOR SELECT была тонировка.
Народ, извините, я не так давно сунулся в FB, и не понимаю что такое ТС, ХП, и FOR SELECT (это как-то в процедурах реализовывается?).
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Склеить 2 строки в подзапросе / 25 сообщений из 28, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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