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

Откуда:
Сообщений: 6
Добрый день.
Столкнулся с небольшой проблемой. Есть задание :
Дана таблица счетов:
A(
a_id, -- id счета
c_id, -- id клиента
amt, -- сумма остатка
)
Вывести клиентов, у которых остаток по каждому из его счетов больше 0.


Мой запрос выглядит следующим образом:

CREATE TABLE a(a_id int , c_id int, amt int);

INSERT INTO a VALUES(1,1,10);
INSERT INTO a VALUES(2,1,-20);
INSERT INTO a VALUES(3,2,-10);
INSERT INTO a VALUES(4,2,10);
INSERT INTO a VALUES(5,3,100);
INSERT INTO a VALUES(6,3,10);
INSERT INTO a VALUES(7,4,10);
INSERT INTO a VALUES(8,4,0);
INSERT INTO a VALUES(9,5,10);
INSERT INTO a VALUES(10,6,0);

select c_id
from a
group by c_id
having amt>0


Но почему-то выводит и 2-го клиента. Почему так?
27 май 19, 07:37    [21894371]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
aleks222
Member

Откуда:
Сообщений: 747
Стисняюсь спросить: нахера вам HAVING?
27 май 19, 07:45    [21894372]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
Petrovich0909
Member

Откуда:
Сообщений: 6
aleks222,
а каким образом проверять на положительный остаток?
27 май 19, 07:51    [21894376]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
Massa52
Member

Откуда:
Сообщений: 359
Petrovich0909,
select c_id, sum(amt) amt
from a
group by c_id
having sum(amt)>0
27 май 19, 07:59    [21894379]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
Petrovich0909
Member

Откуда:
Сообщений: 6
Massa52,
неправильно ведь. Общую сумму по клиенту мне не нужно, просто если хоть по одному счету у клиента <=0, то он не должен считаться
27 май 19, 08:06    [21894383]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
PizzaPizza
Member

Откуда:
Сообщений: 286
Petrovich0909
Вывести клиентов, у которых остаток по каждому из его счетов больше 0


Етить его русский язык растудыть! А еще и логика мешается...

Остаток по каждому/любому из моих счетов или сумма остатков по всем моим счетам?

Сумму остатков вам уже написали, клиентов, с хотя бы одним счетом > 0 делается where > 0 и distinct. Осталось вам выяснить, что же вы хотели.
27 май 19, 08:10    [21894384]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
fkthat
Member

Откуда:
Сообщений: 1484
select distinct a1.c_id from a a1
   where 0 < all(select amt from a a2 where a2.c_id = a1.c_id)
27 май 19, 08:11    [21894385]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
fkthat
Member

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

Написано ведь: "по каждому"
27 май 19, 08:12    [21894386]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
Щукина Анна
Member

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

[NOT]EXISTS-подзапрос вам в помощь
27 май 19, 08:16    [21894389]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
fkthat
Member

Откуда:
Сообщений: 1484
Еще вариант:

select distinct a1.c_id from a a1
where a1.c_id not in (select a2.c_id from a a2 where a2.amt <= 0)


Что любопытно, что план запроса и там и там одинаковый.
27 май 19, 08:18    [21894391]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
Massa52
Member

Откуда:
Сообщений: 359
Petrovich0909,
Это к вопросу - "зачем" нужен having ot alekca
27 май 19, 08:18    [21894392]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
Petrovich0909
Member

Откуда:
Сообщений: 6
fkthat,
спасибо. Самая правильная логика
27 май 19, 08:24    [21894395]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
PizzaPizza
Member

Откуда:
Сообщений: 286
fkthat
PizzaPizza,
Написано ведь: "по каждому"


Так ведь на заборах пишут, а потом начинают группировки и having без агрегатов. Мысль вольная летит как птица с орнитозом... Сегодня были каждые, но больше нуля, но вчера то были все и не меньше или равно нуля, но те, которые сегодня, они то больше нуля и не нужны.

К вопросу о четком представлении результата задачи.
27 май 19, 08:27    [21894397]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
fkthat
Member

Откуда:
Сообщений: 1484
Petrovich0909
fkthat,
спасибо. Самая правильная логика


Вариант с "exists" (опять-таки тот же план запроса дает):

select distinct a1.c_id from a a1
where not exists(select amt from a a2 where a2.c_id = a1.c_id and a2.amt <=0)
27 май 19, 09:17    [21894416]     Ответить | Цитировать Сообщить модератору
 Re: Поиск ошибки в запросе  [new]
Посетитель
Member

Откуда:
Сообщений: 1384
Petrovich0909
select c_id
from a
group by c_id
having amt>0



select c_id
from a
group by c_id
having min(amt)>0
27 май 19, 09:21    [21894418]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить