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

Откуда:
Сообщений: 93
Доброго дня. Есть набор данных:

if exists (select * from sysobjects where type = 'U' and name = 'test')
begin
drop table test
end

create table test
(
id_r int,
id_w int,
summa numeric(8,2),
id_dlo int
)


insert into test (id_r, id_w, summa, id_dlo) values (189371, 40, 247932.14, 209839)
insert into test (id_r, id_w, summa, id_dlo) values (189372, 12, 247932.14, 209839)
insert into test (id_r, id_w, summa, id_dlo) values (189370, 5, 247932.14, 209839)
insert into test (id_r, id_w, summa, id_dlo) values (189374, 4, 247932, 209839)

SELECT * FROM test

Подскажите каким образом получить на SQL2000 это(т.е нужно из группируемых записей взять id_r у которого id_w=40):

SELECT 189371 AS id_r, MAX(id_w) AS id_w, summa, id_dlo
FROM
test
GROUP BY id_dlo, summa

Having я так понял здесь применить не получится.

Заранее благодарен.
10 авг 15, 11:19    [17997659]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Почему не получится?
10 авг 15, 11:46    [17997797]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Владислав Колосов
Почему не получится?
Потому что он загнал id_w в агрегатную функцию!
10 авг 15, 11:48    [17997801]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20608
Не понимаю, что мешает выполнить отбор до группировки, в секции WHERE...
10 авг 15, 11:48    [17997803]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
iap
Владислав Колосов
Почему не получится?
Потому что он загнал id_w в агрегатную функцию!


Он выберем максимальные сороковки и отфильтрует их HAVING. Хотя автор не дал точного определения - чего же ему надо.
10 авг 15, 12:38    [17998169]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Garisson
Member

Откуда:
Сообщений: 93
Владислав Колосов
iap
пропущено...
Потому что он загнал id_w в агрегатную функцию!


Он выберем максимальные сороковки и отфильтрует их HAVING. Хотя автор не дал точного определения - чего же ему надо.


мне нужно получить в выборке id_r=189371, но приходится указывать либо min либо max, само собой и получаю не те id_r, как получить именно id_r у которого id_w=40 не пойму.

SELECT MAX(id_r) as id_r,MAX(id_w) as id_w,summa, id_dlo
FROM
test
GROUP BY id_dlo, summa HAVING MAX(id_w)>1
10 авг 15, 14:26    [17998969]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1456
Garisson,

а зачем вы вообще применяете агрегацию?

SELECT 
      id_r,
      id_w,
      summa,
      id_dlo
FROM test
where id_w = 40


а если данные надо сгруппировать, то укажите точно по каким критериям должна быть группировка

а лучше результирующую строку что вы в итоге хотите получить
10 авг 15, 14:33    [17999019]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20608
Объясните вменяемо, почему не устраивает запрос
SELECT id_r, id_w, summa, id_dlo
FROM test
WHERE id_w=40

?
10 авг 15, 14:35    [17999041]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Garisson
Member

Откуда:
Сообщений: 93
Akina
Объясните вменяемо, почему не устраивает запрос
SELECT id_r, id_w, summa, id_dlo
FROM test
WHERE id_w=40

?


Получить нужно это:
SELECT 189371 AS id_r, MAX(id_w) AS id_w, summa, id_dlo
FROM
test
GROUP BY id_dlo, summa

т.е алгоритм такой, если есть строка с id_w=40 и у нее есть дубликаты по summa и id_dlo, то берем id_r у записи с этим id_w=40, остальные записи у которых нет дубликатов с записью id_w=40, так-же нужно получить в выборке.
10 авг 15, 14:46    [17999131]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 650
Garisson,
?
SELECT  [group].[id_dlo]
      , [group].[summa] 
      , [tt].[id_r]  
    FROM(SELECT  [t].[id_dlo]
               , [t].[summa]
            FROM [test] [t]
            GROUP BY  [t].[id_dlo]
                    , [t].[summa]
        ) [group]
        LEFT OUTER JOIN [test] [tt] ON [tt].[id_dlo] = [group].[id_dlo]
                                   AND [tt].[summa]  = [group].[summa]
                                   AND [tt].[id_w]   = 40
10 авг 15, 14:50    [17999151]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 2996
Garisson
Akina
Объясните вменяемо, почему не устраивает запрос
SELECT id_r, id_w, summa, id_dlo
FROM test
WHERE id_w=40

?


Получить нужно это:
SELECT 189371 AS id_r, MAX(id_w) AS id_w, summa, id_dlo
FROM
test
GROUP BY id_dlo, summa

т.е алгоритм такой, если есть строка с id_w=40 и у нее есть дубликаты по summa и id_dlo, то берем id_r у записи с этим id_w=40, остальные записи у которых нет дубликатов с записью id_w=40, так-же нужно получить в выборке.

select 
	Coalesce(max(case when id_w = 40 then id_r else null end), max(id_r))
	, summa
	, id_dlo
from
	test
group by
	summa
	, id_dlo

?

PS: а что должно получится, если будет добавлена ещё одна запись
insert into test (id_r, id_w, summa, id_dlo) values (189375, 4, 247932, 209839)
10 авг 15, 15:00    [17999215]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Garisson
Member

Откуда:
Сообщений: 93
HandKot
Garisson
пропущено...


Получить нужно это:
SELECT 189371 AS id_r, MAX(id_w) AS id_w, summa, id_dlo
FROM
test
GROUP BY id_dlo, summa

т.е алгоритм такой, если есть строка с id_w=40 и у нее есть дубликаты по summa и id_dlo, то берем id_r у записи с этим id_w=40, остальные записи у которых нет дубликатов с записью id_w=40, так-же нужно получить в выборке.

select 
	Coalesce(max(case when id_w = 40 then id_r else null end), max(id_r))
	, summa
	, id_dlo
from
	test
group by
	summa
	, id_dlo

?

PS: а что должно получится, если будет добавлена ещё одна запись
insert into test (id_r, id_w, summa, id_dlo) values (189375, 4, 247932, 209839)


Это то что нужно, ситуации с такой строкой быть не должно, но даже если и возникнет, то не принципиально какой id_r брать.
Ребята всем спасибо за помощь.
10 авг 15, 15:08    [17999282]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20608
Garisson
если есть строка с id_w=40 и у нее есть дубликаты по summa и id_dlo, то берем id_r у записи с этим id_w=40, остальные записи у которых нет дубликатов с записью id_w=40, так-же нужно получить в выборке.

select id_r, id_w, summa, id_dlo 
from ( select id_r, id_w, summa, id_dlo,
       dense_rank() over (partition by summa, id_dlo order by (case when id_w=40 then 0 else 1 end)) as denserank
       from test ) as dummy
where denserank = 1
10 авг 15, 15:51    [17999644]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Konst_One
Member

Откуда:
Сообщений: 11540
sql 2000 откуда там OVER(partition by
10 авг 15, 16:03    [17999728]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь с запросом.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 20608
Konst_One, сорри, версию не разглядел.
10 авг 15, 16:06    [17999748]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить