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

Откуда: РБ
Сообщений: 950
вот такой запрос
select kod_if, kod_vr,
case kod_if
when 1 then id_zak
else '1'
end as 'zak'
from pldo_vip.object as ob
group by kod_if, kod_vr, id_zak
order by kod_if, kod_vr, id_zak
возвращает
kod_if kod_vr id_zak
1 1 1
1 1 3
1 1 29
1 2 41
3 1 1
3 1 1
3 1 1
... ... ...
3 1 1
3 2 1
3 2 1
3 2 1
3 3 1
3 3 1
3 3 1
... ... ...

как получить
kod_if kod_vr id_zak
1 1 1
1 1 3
1 1 29
1 2 41
3 1 1
3 2 1
3 3 1

почему так выходит я же использую group by ?

зы Microsoft SQL Server 2005 - 9.00.4207.00 (Intel X86)
12 фев 09, 10:52    [6810211]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Ну дак вы группируете по id_zak, а выводите то case...

--------------------------------------------------------------
Дьявол кроется в деталях.
12 фев 09, 11:02    [6810297]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
вот, продолжайте не стесняйтесь...:)
12 фев 09, 11:03    [6810303]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
declare @zak_vr table
(kod_if		tinyint,
 kod_vr		tinyint,
 id_zak		int)

insert @zak_vr
select kod_if, kod_vr,
case kod_if
when 1 then id_zak
else '1'
end as 'id_zak'
from pldo_vip.object as ob
where ob.god_sd >= 2009 and ob.god_nr <= 2009
group by kod_if, kod_vr, id_zak
order by kod_if, kod_vr, id_zak

declare @zak table
(kod_if		tinyint,
 kod_vr		tinyint,
 id_zak		int,
primary key clustered(kod_if, kod_vr, id_zak))
insert @zak
select kod_if, kod_vr, id_zak
from @zak_vr
group by kod_if, kod_vr, id_zak

kod_if kod_vr id_zak
1 1 3
1 1 29
1 2 41
3 1 1
3 2 1
3 3 1

без промежуточной таблицы можно?
12 фев 09, 11:06    [6810333]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

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

без промежуточной таблицы можно?

Можно. Не стесняйтесь, продолжайте эксперементировать
12 фев 09, 11:07    [6810339]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
koJIo6ok
без промежуточной таблицы можно?

группировать по тому по чему вам нужно
12 фев 09, 11:10    [6810353]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
Glory
koJIo6ok

без промежуточной таблицы можно?

Можно. Не стесняйтесь, продолжайте эксперементировать

ну я же пошутил
12 фев 09, 11:11    [6810358]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

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

без промежуточной таблицы можно?

Можно. Не стесняйтесь, продолжайте эксперементировать

ну я же пошутил

А все поля в group by вы тоже ради шутки засунули ?
12 фев 09, 11:12    [6810369]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
koJIo6ok, зря от Дедушки ушёл!
12 фев 09, 11:14    [6810378]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
Glory,
select kod_if, kod_vr,
case kod_if
when 1 then id_zak
else '1'
end as 'id_zak'
from pldo_vip.object as ob
where ob.god_sd >= 2009 and ob.god_nr <= 2009
group by kod_if, kod_vr
order by kod_if, kod_vr, id_zak
Msg 8120, Level 16, State 1, Line 1
Column 'pldo_vip.object.id_zak' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
просто если не пишу в GROUP BY поле то он не дает его выбрать - только из этих соображений, хотя я догадываюсь что я гдн-то не допонимаю
12 фев 09, 11:15    [6810391]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
koJIo6ok
Glory,
select kod_if, kod_vr,
case kod_if
when 1 then id_zak
else '1'
end as 'id_zak'
from pldo_vip.object as ob
where ob.god_sd >= 2009 and ob.god_nr <= 2009
group by kod_if, kod_vr
order by kod_if, kod_vr, id_zak
Msg 8120, Level 16, State 1, Line 1
Column 'pldo_vip.object.id_zak' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
просто если не пишу в GROUP BY поле то он не дает его выбрать - только из этих соображений, хотя я догадываюсь что я гдн-то не допонимаю

И что теперь непонятного в серверном сообщениии ? Где an aggregate function ?
12 фев 09, 11:17    [6810408]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

>хотя я догадываюсь что я гдн-то не допонимаю

в group by можно не только имена столбцов указывать, но и выражения тоже. case тот же, например.

Posted via ActualForum NNTP Server 1.4

12 фев 09, 11:18    [6810409]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
koJIo6ok,

весь CASE (а не id_zak) запихать в GROUP BY не пробовали?
12 фев 09, 11:18    [6810417]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950

select kod_if, kod_vr,
case kod_if
when 1 then id_zak
else '1'
end as 'kod_zak'
from pldo_vip.object
where god_sd >= 2009 and god_nr <= 2009
group by kod_if, kod_vr, case kod_if
when 1 then id_zak
else '1' end
order by kod_if, kod_vr, kod_zak
а я думал он туда не влезет !!! то что надо пасиб
12 фев 09, 11:21    [6810447]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
Glory
koJIo6ok
Glory,
select kod_if, kod_vr,
case kod_if
when 1 then id_zak
else '1'
end as 'id_zak'
from pldo_vip.object as ob
where ob.god_sd >= 2009 and ob.god_nr <= 2009
group by kod_if, kod_vr
order by kod_if, kod_vr, id_zak
Msg 8120, Level 16, State 1, Line 1
Column 'pldo_vip.object.id_zak' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
просто если не пишу в GROUP BY поле то он не дает его выбрать - только из этих соображений, хотя я догадываюсь что я гдн-то не допонимаю

И что теперь непонятного в серверном сообщениии ? Где an aggregate function ?

ну если бы мне нужно было sum или count id_zak я бы написал но такой ф-ции агрегатной что бы просто вывести я не знаю
12 фев 09, 11:23    [6810466]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

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

ну если бы мне нужно было sum или count id_zak я бы написал но такой ф-ции агрегатной что бы просто вывести я не знаю

А прочитать в хелпе про все агрегатные функции не позволяет религия, фаза луны, гороскоп на сегодняшний день и тп
12 фев 09, 11:28    [6810510]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
Glory,
да я всегда читаю прежде чем спрашивать - у меня есть новый BOL
но вот честно не нашел ничего или не понял что это то что нужно
12 фев 09, 11:45    [6810679]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
ну откройте мне тайну какая это агр функция
select m.id_ob, m.kod_gr, mg.nazv_gr, isnull(m.kod_sgr1, 0), msgr_1.nazv_sgr, isnull(m.kod_sgr2, 0), msgr_2.nazv_sgr, sum(m.amount)
from prdo.mat_rash as m
inner join prdo.mat_group as mg
on m.kod_gr = mg.kod_gr
left join prdo.mat_subgroup_1 as msgr_1
on m.kod_sgr1 = msgr_1.kod_sgr
left join prdo.mat_subgroup_2 as msgr_2
on m.kod_sgr2 = msgr_2.kod_sgr
where m.god = 2009 and m.kod_mes < 5
group by m.id_ob, m.kod_gr, mg.nazv_gr, m.kod_sgr1, msgr_1.nazv_sgr, m.kod_sgr2, msgr_2.nazv_sgr
работает, но для для расчета
sum(m.amount)
достаточно
group by m.id_ob, m.kod_gr, m.kod_sgr1, m.kod_sgr2
но тогда в selecte ошибка
Microsoft SQL Server 2005 - 9.00.4220.00 (Intel X86)
Msg 8120, Level 16, State 1, Line 1
Column 'prdo.mat_group.nazv_gr' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
6 май 09, 15:48    [7153849]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
koJIo6ok
но тогда в selecte ошибка
Microsoft SQL Server 2005 - 9.00.4220.00 (Intel X86)
Msg 8120, Level 16, State 1, Line 1
Column 'prdo.mat_group.nazv_gr' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.

И что именно вам непонятно из этого сообщения ?
6 май 09, 15:56    [7153910]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
Колонна 'prdo.mat_group.nazv_gr недействительна в списке выбора поскольку она не содержалась в или составная функция или ГРУППА статьей.
все понятно - чтобы выбрать в селекте nazv_gr я её помещаю в GROUP BY, но ведь это не обязательно же да? можно же как-то подругому как вы писали выше -
агрегатная функция(nazv_gr) и тогда в GROUP BY nazv_gr не надо помещать так ведь? но какая это агр функция? или я не прав?
6 май 09, 16:03    [7153980]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
koJIo6ok
Колонна 'prdo.mat_group.nazv_gr недействительна в списке выбора поскольку она не содержалась в или составная функция или ГРУППА статьей.
все понятно - чтобы выбрать в селекте nazv_gr я её помещаю в GROUP BY, но ведь это не обязательно же да? можно же как-то подругому как вы писали выше -
агрегатная функция(nazv_gr) и тогда в GROUP BY nazv_gr не надо помещать так ведь? но какая это агр функция? или я не прав?
Не прав. Для каждого слагаемого nazv_gr может иметь своё, отличное от других строк, значение.
Какое же из них сервер должен показать на суммарной строке?
6 май 09, 16:11    [7154055]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
Glory
Member

Откуда:
Сообщений: 104760
koJIo6ok
но какая это агр функция?

Та, которая даст вам нужный результат. Какой результат для вас является нужным, вам лучше знать. Здесь вы его не опубликовали
6 май 09, 16:13    [7154070]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
koJIo6ok
Member

Откуда: РБ
Сообщений: 950
iap
koJIo6ok
Колонна 'prdo.mat_group.nazv_gr недействительна в списке выбора поскольку она не содержалась в или составная функция или ГРУППА статьей.
все понятно - чтобы выбрать в селекте nazv_gr я её помещаю в GROUP BY, но ведь это не обязательно же да? можно же как-то подругому как вы писали выше -
агрегатная функция(nazv_gr) и тогда в GROUP BY nazv_gr не надо помещать так ведь? но какая это агр функция? или я не прав?
Не прав. Для каждого слагаемого nazv_gr может иметь своё, отличное от других строк, значение.
Какое же из них сервер должен показать на суммарной строке?


да но nazv_gr имеет kod_gr по которому я и группирую чтобы получить sum(amount) а nazv_gr добавляю просто потаму что его не могу иначе включить в select

group by m.id_ob, m.kod_gr, mg.nazv_gr, m.kod_sgr1, msgr_1.nazv_sgr, m.kod_sgr2, msgr_2.nazv_sgr
6 май 09, 16:20    [7154148]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
vino
Member

Откуда:
Сообщений: 1191
koJIo6ok, ест функции, которые выдают неизменное значение, max или min, например
6 май 09, 16:46    [7154368]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
vino
koJIo6ok, ест функции, которые выдают неизменное значение, max или min, например
Но это же будут значения, не имеющие смысла. Зачем они вообще в таком случае?
6 май 09, 16:53    [7154416]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить