powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Условие в запросе
25 сообщений из 37, страница 1 из 2
Условие в запросе
    #38313101
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток. Сделал запрос, который возвращает мне общее количество чеков за определённый месяц.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select 
  b.base as [Филиал], 
  count(distinct op.smid) as [Чеки] 
from op
  inner join d on     op.docid = d.id 
  inner join b on     d.bid = b.id 
  inner join w on     op.goodsid = w.code 
where
  (
    b.id in (16,6,106,24,103,36,91,40,25)
  ) and
  (d.doctype = 6) and
  (d.docdate >= convert(datetime, '2013-06-01 00:00:00', 102)) and
  (d.docdate <= convert(datetime, '2013.06.30 23:59:59', 102)) and code between isnull(nullif(-1,-1),-2147483648)
   and isnull(nullif(-1,-1),2147483647) and f1 between isnull(nullif(-1,-1),-2147483648) and isnull(nullif(-1,-1),2147483647) 
   group by 
  b.base 


Сейчас настала необходимость добавить условие диапазона чеков. Пытался добавить вот такое условие:
Код: sql
1.
(sum(op.Quantity*op.Price) between 8000 and 10000)


Но пишет, что в where нельзя использовать агр. функцию. в having если добавить, то будет считать уже всю сумму по всем чекам сразу. В каком месте и что нужно исправить(добавить)?
...
Рейтинг: 0 / 0
Условие в запросе
    #38313114
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогер_самоучка,

открой для себя having
...
Рейтинг: 0 / 0
Условие в запросе
    #38313117
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ВоронцовПрогер_самоучка,

открой для себя having
Вы до конца прочитали стартовый пост ?

Прогер_самоучка в having если добавить, то будет считать уже всю сумму по всем чекам сразу. В каком месте и что нужно исправить(добавить)?
...
Рейтинг: 0 / 0
Условие в запросе
    #38313122
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> в having если добавить, то будет считать уже всю сумму по всем чекам сразу

с чего вы взяли? суммы будут считаться согласно группировке.
...
Рейтинг: 0 / 0
Условие в запросе
    #38313124
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогер_самоучка
Код: sql
1.
2.
3.
  (d.docdate >= convert(datetime, '2013-06-01 00:00:00', 102)) and
  (d.docdate <= convert(datetime, '2013.06.30 23:59:59', 102)) and code between isnull(nullif(-1,-1),-2147483648)
   and isnull(nullif(-1,-1),2147483647) and f1 between isnull(nullif(-1,-1),-2147483648) and isnull(nullif(-1,-1),2147483647)

Это вот что:
Код: sql
1.
d.docdate>='20130601' and d.docdate<'20130701' and code is not null and f1 not null
...
Рейтинг: 0 / 0
Условие в запросе
    #38313141
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daw> в having если добавить, то будет считать уже всю сумму по всем чекам сразу

с чего вы взяли? суммы будут считаться согласно группировке.
Я понимаю, что согласно группировке. Ещё бы и понять каким образом.
...
Рейтинг: 0 / 0
Условие в запросе
    #38313144
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapПрогер_самоучка[/src]Это вот что:
Код: sql
1.
d.docdate>='20130601' and d.docdate<'20130701' and code is not null and f1 not null


Не совсем вас понял. Это вы спросили или поправили?)
...
Рейтинг: 0 / 0
Условие в запросе
    #38313150
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Я понимаю, что согласно группировке. Ещё бы и понять каким образом.

то есть, что значит "каким"? ну выведите ее в select-листе:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
select 
  b.base as [Филиал], 
  count(distinct op.smid) as [Чеки] 
  , sum(op.Quantity*op.Price)
from op
  inner join d on     op.docid = d.id 
  inner join b on     d.bid = b.id 
  inner join w on     op.goodsid = w.code 
where
  (
    b.id in (16,6,106,24,103,36,91,40,25)
  ) and
  (d.doctype = 6) and
  (d.docdate >= convert(datetime, '2013-06-01 00:00:00', 102)) and
  (d.docdate <= convert(datetime, '2013.06.30 23:59:59', 102)) and code between isnull(nullif(-1,-1),-2147483648)
   and isnull(nullif(-1,-1),2147483647) and f1 between isnull(nullif(-1,-1),-2147483648) and isnull(nullif(-1,-1),2147483647) 
   group by 
  b.base 



вот эта сумма и будет проверяться в having.
...
Рейтинг: 0 / 0
Условие в запросе
    #38313159
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daw> Я понимаю, что согласно группировке. Ещё бы и понять каким образом.

то есть, что значит "каким"? ну выведите ее в select-листе:

вот эта сумма и будет проверяться в having.
Выводил я так в select. Поэтому и говорю, что будет считать сумму сразу всех чеков.
Было вот так с добавлением having
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select 
  b.base as [Филиал], 
  count(distinct op.smid) as [Чеки] 
  , sum(op.Quantity*op.Price)
from op
  inner join d on     op.docid = d.id 
  inner join b on     d.bid = b.id 
  inner join w on     op.goodsid = w.code 
where
  (
    b.id in (16,6,106,24,103,36,91,40,25)
  ) and
  (d.doctype = 6) and
  (d.docdate >= convert(datetime, '2013-06-01 00:00:00', 102)) and
  (d.docdate <= convert(datetime, '2013.06.30 23:59:59', 102)) and code between isnull(nullif(-1,-1),-2147483648)
   and isnull(nullif(-1,-1),2147483647) and f1 between isnull(nullif(-1,-1),-2147483648) and isnull(nullif(-1,-1),2147483647) 
   group by 
  b.base
 having   sum(op.Quantity*op.Price)
...
Рейтинг: 0 / 0
Условие в запросе
    #38313164
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогер_самоучкаdaw> Я понимаю, что согласно группировке. Ещё бы и понять каким образом.

то есть, что значит "каким"? ну выведите ее в select-листе:

вот эта сумма и будет проверяться в having.
Выводил я так в select. Поэтому и говорю, что будет считать сумму сразу всех чеков.
Было вот так с добавлением having
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select 
  b.base as [Филиал], 
  count(distinct op.smid) as [Чеки] 
  , sum(op.Quantity*op.Price)
from op
  inner join d on     op.docid = d.id 
  inner join b on     d.bid = b.id 
  inner join w on     op.goodsid = w.code 
where
  (
    b.id in (16,6,106,24,103,36,91,40,25)
  ) and
  (d.doctype = 6) and
  (d.docdate >= convert(datetime, '2013-06-01 00:00:00', 102)) and
  (d.docdate <= convert(datetime, '2013.06.30 23:59:59', 102)) and code between isnull(nullif(-1,-1),-2147483648)
   and isnull(nullif(-1,-1),2147483647) and f1 between isnull(nullif(-1,-1),-2147483648) and isnull(nullif(-1,-1),2147483647) 
   group by 
  b.base
 having   (sum(op.Quantity*op.Price) between 8000 and 10000)


З.Ы. Исправленный вариант
...
Рейтинг: 0 / 0
Условие в запросе
    #38313165
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> count(distinct op.smid) as [Чеки]

ааа, distinct. догадываюсь кажется. у вас join-ы "размножают" строки в op и суммы странные получаются?
...
Рейтинг: 0 / 0
Условие в запросе
    #38313167
Фотография daw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чтобы понятнее стало, вы уберите группировку и посмотрите, что выводится.
а "как бороться?" - ну, в вашем случае можно эти join-ы через exists переписать.
...
Рейтинг: 0 / 0
Условие в запросе
    #38313174
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
daw> count(distinct op.smid) as [Чеки]

ааа, distinct. догадываюсь кажется. у вас join-ы "размножают" строки в op и суммы странные получаются?
Запредельные суммы получаются))) Количество чеков запрос выдаёт правильное. Вот как прописать сие условие, что на каждый чек, пока не соображу. Подозреваю, что эта "странная сумма" как раз и сумма сразу всех чеков.
...
Рейтинг: 0 / 0
Условие в запросе
    #38313235
Cygapb-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dawчтобы понятнее стало, вы уберите группировку и посмотрите, что выводится.
а "как бороться?" - ну, в вашем случае можно эти join-ы через exists переписать.Добавил бы: уберите группировку и поставьте фильтр по какому-нибудь (может по очереди по разным) OP.SMID чтобы (на обозримом количестве данных) убедиться в отсутствии задваивания строк.
Может быть, и от DISTINCT в COUNT удастся избавиться :)
...
Рейтинг: 0 / 0
Условие в запросе
    #38313303
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогер_самоучкаiapпропущено...
Это вот что:
Код: sql
1.
d.docdate>='20130601' and d.docdate<'20130701' and code is not null and f1 not null


Не совсем вас понял. Это вы спросили или поправили?)Заменил на эквивалент
...
Рейтинг: 0 / 0
Условие в запросе
    #38313554
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
iapЗаменил на эквивалент На самом деле это часть собирается в программе, поэтому там именно так :)
...
Рейтинг: 0 / 0
Условие в запросе
    #38313574
Фотография Павел Воронцов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогер_самоучкаВыводил я так в select. Поэтому и говорю, что будет считать сумму сразу всех чеков.
Было вот так с добавлением havingНе зная схему данных трудно угадывать, но скорей всего Вам нужно что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select 
  b.base as [Филиал], 
  sum(op1.chks) as [Чеки] 
from (select docid
             , goodsid
             , count(distinct smid) as chks
             , sum(op.Quantity*op.Price) as summ
from op
group by docid
             , goodsid) op1
  inner join d on     op1.docid = d.id 
  inner join b on     d.bid = b.id 
  inner join w on     op1.goodsid = w.code 
where
  (
    b.id in (16,6,106,24,103,36,91,40,25)
  ) and
  (d.doctype = 6) and
  (d.docdate >= convert(datetime, '2013-06-01 00:00:00', 102)) and
  (d.docdate <= convert(datetime, '2013.06.30 23:59:59', 102)) and code between isnull(nullif(-1,-1),-2147483648)
   and isnull(nullif(-1,-1),2147483647) and f1 between isnull(nullif(-1,-1),-2147483648) and isnull(nullif(-1,-1),2147483647) 
   group by 
  b.base
  having sum(op1.summ) between 8000 and 10000
...
Рейтинг: 0 / 0
Условие в запросе
    #38313580
=)8)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прогер_самоучкаiapЗаменил на эквивалент На самом деле это часть собирается в программе, поэтому там именно так :)на самом деле и в программе это лучше заменить на
(@code=-1 or code=@code) and (@f1=-1 or f1=@f1) :))
...
Рейтинг: 0 / 0
Условие в запросе
    #38313586
=)8)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Павел ВоронцовНе зная схему данных трудно угадывать+100500
...
Рейтинг: 0 / 0
Условие в запросе
    #38313657
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ВоронцовПрогер_самоучкаВыводил я так в select. Поэтому и говорю, что будет считать сумму сразу всех чеков.
Было вот так с добавлением havingНе зная схему данных трудно угадывать, но скорей всего Вам нужно что-то типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select 
  b.base as [Филиал], 
  sum(op1.chks) as [Чеки] 
from (select docid
             , goodsid
             , count(distinct smid) as chks
             , sum(op.Quantity*op.Price) as summ
from op
group by docid
             , goodsid) op1
  inner join d on     op1.docid = d.id 
  inner join b on     d.bid = b.id 
  inner join w on     op1.goodsid = w.code 
where
  (
    b.id in (16,6,106,24,103,36,91,40,25)
  ) and
  (d.doctype = 6) and
  (d.docdate >= convert(datetime, '2013-06-01 00:00:00', 102)) and
  (d.docdate <= convert(datetime, '2013.06.30 23:59:59', 102)) and code between isnull(nullif(-1,-1),-2147483648)
   and isnull(nullif(-1,-1),2147483647) and f1 between isnull(nullif(-1,-1),-2147483648) and isnull(nullif(-1,-1),2147483647) 
   group by 
  b.base
  having sum(op1.summ) between 8000 and 10000



Очень даже похоже. Только не пойму, почему ничего не возвращает. Внутренний запрос отрабатывает. А по внешнему почему-то нет.

З.Ы. Под схемой данных вы подразумеваете структуры таблиц ?
...
Рейтинг: 0 / 0
Условие в запросе
    #38313665
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прогер_самоучкаОчень даже похоже. Только не пойму, почему ничего не возвращает. Внутренний запрос отрабатывает. А по внешнему почему-то нет.

Разобрался вроде бы. Нужно было в конце в группировке указать колонку chks по которой группировка chks
...
Рейтинг: 0 / 0
Условие в запросе
    #38334126
Прогер_самоучка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго времени суток.
Есть запрос, в котором есть условие
Код: sql
1.
2.
where code between isnull(nullif(-1,-1),-2147483648) and isnull(nullif(-1,-1),2147483647) and
 f1 between isnull(nullif(-1,-1),-2147483648) and isnull(nullif(-1,-1),2147483647)


Раньше этот запрос отрабатывал нормально. Сейчас выскакивает ошибка:

Код: plaintext
Ошибка арифметического переполнения для типа данных smallint, значение = -2147483648

Но, поля Code и F1 в базе имеют тип int. раньше стоял ms sql server 2000.
Сейчас:
Код: sql
1.
2.
3.
4.
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4263.0 (X64) 	
	Aug 23 2012 15:56:56 
	Copyright (c) Microsoft Corporation
	Enterprise Edition (64-bit) on Windows NT 6.0 <X64> (Build 6002: Service Pack 2)


Хотелось бы прояснения ситуации.
Заранее благодарю за ответы.
...
Рейтинг: 0 / 0
Условие в запросе
    #38334159
Прогер_самоучка,

тип полей тут вообще ни при чем,
любое из этох двух вызовет ту же ошибку:
Код: sql
1.
2.
select isnull(nullif(-1,-1),-2147483648)
select isnull(nullif(-1,-1),2147483647)



но ответьте плиз, откуда такой огород, почему не подходит
Код: sql
1.
where code = -1 and f1 = -1
...
Рейтинг: 0 / 0
Условие в запросе
    #38334166
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
капец полный,

вроде, выше говорилось, что это частный случай скрипта, генерирующегося автоматически
...
Рейтинг: 0 / 0
Условие в запросе
    #38334168
=)8)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а тип параметра какой? Скорее всего, что-то вроде этого:
Код: sql
1.
2.
3.
4.
5.
6.
declare @code smallint=-1
...
select ...
where ...
   and code between isnull(nullif(@code,-1),-2147483648) and isnull(nullif(@code,-1),2147483647)
...

исправьте тип на int - ошибка уйдет
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Условие в запросе
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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