Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
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] Ответить | Цитировать Сообщить модератору |
aleks222 Member Откуда: Сообщений: 1244 |
Стисняюсь спросить: нахера вам HAVING? |
27 май 19, 07:45 [21894372] Ответить | Цитировать Сообщить модератору |
Petrovich0909 Member Откуда: Сообщений: 6 |
aleks222, а каким образом проверять на положительный остаток? |
27 май 19, 07:51 [21894376] Ответить | Цитировать Сообщить модератору |
Massa52 Member Откуда: Сообщений: 382 |
Petrovich0909,select c_id, sum(amt) amt from a group by c_id having sum(amt)>0 |
27 май 19, 07:59 [21894379] Ответить | Цитировать Сообщить модератору |
Petrovich0909 Member Откуда: Сообщений: 6 |
Massa52, неправильно ведь. Общую сумму по клиенту мне не нужно, просто если хоть по одному счету у клиента <=0, то он не должен считаться |
27 май 19, 08:06 [21894383] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 417 |
Етить его русский язык растудыть! А еще и логика мешается... Остаток по каждому/любому из моих счетов или сумма остатков по всем моим счетам? Сумму остатков вам уже написали, клиентов, с хотя бы одним счетом > 0 делается where > 0 и distinct. Осталось вам выяснить, что же вы хотели. |
||
27 май 19, 08:10 [21894384] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4407 |
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] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4407 |
PizzaPizza, Написано ведь: "по каждому" |
27 май 19, 08:12 [21894386] Ответить | Цитировать Сообщить модератору |
Щукина Анна Member Откуда: Сообщений: 1507 |
Petrovich0909, [NOT]EXISTS-подзапрос вам в помощь |
27 май 19, 08:16 [21894389] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4407 |
Еще вариант: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] Ответить | Цитировать Сообщить модератору |
Massa52 Member Откуда: Сообщений: 382 |
Petrovich0909, Это к вопросу - "зачем" нужен having ot alekca |
27 май 19, 08:18 [21894392] Ответить | Цитировать Сообщить модератору |
Petrovich0909 Member Откуда: Сообщений: 6 |
fkthat, спасибо. Самая правильная логика |
27 май 19, 08:24 [21894395] Ответить | Цитировать Сообщить модератору |
PizzaPizza Member Откуда: Сообщений: 417 |
Так ведь на заборах пишут, а потом начинают группировки и having без агрегатов. Мысль вольная летит как птица с орнитозом... Сегодня были каждые, но больше нуля, но вчера то были все и не меньше или равно нуля, но те, которые сегодня, они то больше нуля и не нужны. К вопросу о четком представлении результата задачи. |
||
27 май 19, 08:27 [21894397] Ответить | Цитировать Сообщить модератору |
fkthat Member Откуда: Сообщений: 4407 |
Вариант с "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] Ответить | Цитировать Сообщить модератору |
Посетитель Member Откуда: Сообщений: 1210 |
select c_id from a group by c_id having min(amt)>0 |
||
27 май 19, 09:21 [21894418] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |