powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Склеить 2 строки в подзапросе
25 сообщений из 28, страница 1 из 2
Склеить 2 строки в подзапросе
    #39270787
superbalbes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такой запрос при выборке материалов из таблицы для формирования файла в 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
Склеить 2 строки в подзапросе
    #39270792
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hello, Superbalbes!
You wrote on 8 июля 2016 г. 17:12:16:

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

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

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

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

select first 1 goods.marking

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

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

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

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

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

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

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

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


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

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

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


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

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

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


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