powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск ошибки в запросе
15 сообщений из 15, страница 1 из 1
Поиск ошибки в запросе
    #39818562
Petrovich0909
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Столкнулся с небольшой проблемой. Есть задание :
Дана таблица счетов:
A(
a_id, -- id счета
c_id, -- id клиента
amt, -- сумма остатка
)
Вывести клиентов, у которых остаток по каждому из его счетов больше 0.


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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
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-го клиента. Почему так?
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818563
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Стисняюсь спросить: нахера вам HAVING?
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818567
Petrovich0909
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222,
а каким образом проверять на положительный остаток?
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818569
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrovich0909,
Код: sql
1.
2.
3.
4.
select c_id, sum(amt) amt
from a
group by c_id
having sum(amt)>0
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818573
Petrovich0909
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Massa52,
неправильно ведь. Общую сумму по клиенту мне не нужно, просто если хоть по одному счету у клиента <=0, то он не должен считаться
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818574
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrovich0909Вывести клиентов, у которых остаток по каждому из его счетов больше 0

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

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

Сумму остатков вам уже написали, клиентов, с хотя бы одним счетом > 0 делается where > 0 и distinct. Осталось вам выяснить, что же вы хотели.
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818575
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
select distinct a1.c_id from a a1
   where 0 < all(select amt from a a2 where a2.c_id = a1.c_id)
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818576
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PizzaPizza,

Написано ведь: "по каждому"
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818579
Фотография Щукина Анна
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrovich0909,

[NOT]EXISTS-подзапрос вам в помощь
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818581
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вариант:

Код: sql
1.
2.
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)



Что любопытно, что план запроса и там и там одинаковый.
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818582
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrovich0909,
Это к вопросу - "зачем" нужен having ot alekca
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818584
Petrovich0909
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
fkthat,
спасибо. Самая правильная логика
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818586
PizzaPizza
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fkthatPizzaPizza,
Написано ведь: "по каждому"

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

К вопросу о четком представлении результата задачи.
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818595
fkthat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrovich0909fkthat,
спасибо. Самая правильная логика

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

Код: sql
1.
2.
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)
...
Рейтинг: 0 / 0
Поиск ошибки в запросе
    #39818596
Посетитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petrovich0909
Код: sql
1.
2.
3.
4.
select c_id
from a
group by c_id
having amt>0




Код: sql
1.
2.
3.
4.
select c_id
from a
group by c_id
having min(amt)>0
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Поиск ошибки в запросе
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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