Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите составить запрос select  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
так
select 'название' as nazv_ob, -- ob.nazv_ob,
case isnull(meri.summa, 0)
when 0 then doc.nazv_sokr + SPACE(1) + 'от' + SPACE(1) + CONVERT(varchar(10), meri.data, 104) + SPACE(1) + '№' + meri.nomer
else 'на' + space(1) + convert(varchar(10), meri.summa) + SPACE(1) + doc.nazv_sokr + SPACE(1) + 'от' + SPACE(1) + CONVERT(varchar(10), meri.data, 104) + SPACE(1) + '№' + meri.nomer
end as meri,
'prim' as prim -- prim.prim
from pldo_vip.object as ob
inner join pldo_fin.ob_meri as meri
on ob.id_ob = meri.id_ob -- and meri.flagIsp = 0
inner join nw.nazv_document as doc
on meri.kod_doc = doc.kod
left join pldo_fin.prim_fin as prim
on ob.id_ob = prim.id_ob
where ob.id_ob = 51
получаю
nazv_ob meri prim
название нет данных от 01.12.2009 №2 prim
название на 765765.0 п/п от 15.12.2009 №1 prim
название на 4000.0 п/п от 16.12.2009 №1 prim
название на 5000.0 п/п ИМНС от 16.12.2009 №1 prim

а надо получить
nazv_ob prim
название нет данных от 01.12.2009 №2 на 765765.0 п/п от 15.12.2009 №1 на 4000.0 п/п от 16.12.2009 №1 на 5000.0 п/п ИМНС от 16.12.2009 №1 prim

то есть собрать в одну строку записи из таблиц prim(один к одному с таблицей object) и meri(многие к одному с таблицей object)
что-то не получается ни как
select @@VERSION

Microsoft SQL Server 2008 (SP1) - 10.0.2746.0 (Intel X86)
Nov 9 2009 16:59:31
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)

в идеале было бы здорово -

nazv_ob prim
название нет данных от 01.12.2009 №2,
на 765765.0 п/п от 15.12.2009 №1,
на 4000.0 п/п от 16.12.2009 №1,
на 5000.0 п/п ИМНС от 16.12.2009 №1,
prim
17 дек 09, 13:09    [8080141]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос select  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Как-то так?
SELECT ob.id_ob, 'название' nazv_ob,
(
 SELECT
  CASE ISNULL(meri.summa,0)
   WHEN 0 THEN doc.nazv_sokr+' от '+CONVERT(VARCHAR(10),meri.data,104)+' №'+meri.nomer
   ELSE 'на '+CONVERT(VARCHAR(10),meri.summa)+' '+doc.nazv_sokr+' от '+CONVERT(VARCHAR(10),meri.data,104)+' №'+meri.nomer
 END
 FROM pldo_fin.ob_meri meri JOIN nw.nazv_document doc ON meri.kod_doc=doc.kod
 WHERE meri.id_ob=ob.id_ob
 FOR XML PATH(''), TYPE
).value('.','VARCHAR(MAX)') meri,
'prim' prim
FROM pldo_vip.object ob LEFT JOIN pldo_fin.prim_fin prim ON ob.id_ob=prim.id_ob;
Если одну строку надо только для ob.id_ob = 51,
то, конечно, молжно намного проще через переменную.

Ну и рекурсивное CTE можно использовать...
17 дек 09, 13:27    [8080266]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос select  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
спасибо так поприятнее чем я хотел
declare @meri table
(id				int			identity(1,1) primary key clustered,
 mer			varchar(50)	not null)
insert into @meri
select case isnull(meri.summa, 0)
when 0 then doc.nazv_sokr + SPACE(1) + 'от' + SPACE(1) + CONVERT(varchar(10), meri.data, 104) + SPACE(1) + '№' + meri.nomer
else 'на' + space(1) + convert(varchar(10), meri.summa) + SPACE(1) + doc.nazv_sokr + SPACE(1) + 'от' + SPACE(1) + CONVERT(varchar(10), meri.data, 104) + SPACE(1) + '№' + meri.nomer
end as meri
from pldo_fin.ob_meri as meri
inner join nw.nazv_document as doc
on meri.kod_doc = doc.kod

declare @count int
set @count = (select COUNT(id) from @meri)
declare @counter int
set @counter = 1
declare @meri_result varchar(max)
set @meri_result = ''

while (@counter <= @count)
begin
    set @meri_result += (select mer + ', ' from @meri where id = @counter)
	set @counter += 1	
	continue
end
select @meri_result

на 765765.0 п/п от 15.12.2009 №1, на 4000.0 п/п от 16.12.2009 №1, акт от 01.12.2009 №2, на 5000.0 п/п ИМНС от 16.12.2009 №1,

что-то не могу найти в BOL-e про
FOR XML PATH(''), TYPE
).value('.','VARCHAR(MAX)') meri,
с вашего примера, разобраться охота, ссылку не дадите?
17 дек 09, 14:06    [8080602]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос select  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
koJIo6ok
что-то не могу найти в BOL-e про
FOR XML PATH(''), TYPE
).value('.','VARCHAR(MAX)') meri,
с вашего примера, разобраться охота, ссылку не дадите?
Использование режима PATH
Предложение FOR
Методы типа данных XML
Метод value() (тип данных xml)
Может, и без value можно, но тогда некоторые спецсимволы XML могут быть во что-нибудь преобразованы.
17 дек 09, 14:36    [8080845]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос select  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
подскажите более гуманный способ получить при X положительном X при Х отрицательном null
case LEFT(@x, 1)
when '-' then null
else @x
end
21 дек 09, 19:41    [8098032]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос select  [new]
iljy
Member

Откуда:
Сообщений: 8711
koJIo6ok,

select case when x>=0 then x end from
(values(1),(2),(-1),(0)) t(x)
?
21 дек 09, 19:57    [8098068]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос select  [new]
aleks2
Guest
koJIo6ok
подскажите более гуманный способ получить при X положительном X при Х отрицательном null
case LEFT(@x, 1)
when '-' then null
else @x
end


select NULLIF(SIGN(@x),-1)*@x
22 дек 09, 06:50    [8099038]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос select  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
то что надо спасибо
22 дек 09, 10:14    [8099474]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить