Переключение на Главную Страницу Страницы: [1] 2  ОтправитьПечать
Горячая тема (более 10 ответов) Помогите с запросом (число прочтений - 6733 )
RuporAbsurda
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Помогите с запросом
23. Декабря 2008 :: 09:05
Печать  
  Есть простой запрос, который по идее должен выводить только последний документ по каждому контрагенту из группы. Но в результате выводятся все документы по каждому контрагенту. Возможно ли выбрать только последний документ?

  |SELECT
  |MAX(CAST (LEFT(tp.date_time_docid, 8) as DateTime)) as ДатаДк ,
  |tp.ktsc0 AS Kt,
  | right(tp.date_time_docid,9) AS Док, 
  | jur.iddocdef As Док_вид,
  |SUM(tp.SUM_) AS sum_op 
  |FROM
  |  _1sentry AS tp (nolock),
  |_1sjourn AS  jur (nolock)
  | Where
  | (tp.date_time_docid=jur.date_time_iddoc) AND
  |  (jur.date_time_iddoc between Очень довольныйate01 and Очень довольныйate02 +  'ZZZZZZZZZZZZZZZ') AND
  |  (tp.KTSC0 IN (SELECT val FROM #ktg)) AND
  |  tp.accktid IN (SELECT val FROM #accs) AND
  |  ((tp.AccDtId IN (SELECT val FROM #accsd01)) OR (tp.AccDtId IN (SELECT val FROM #accsd02))) AND
  |  (tp.ACTIVE='')
  |GROUP BY 
  |tp.ktsc0,
  | right(tp.date_time_docid,9),
  | jur.iddocdef
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с запросом
Ответ #1 - 23. Декабря 2008 :: 09:11
Печать  
RuporAbsurda писал(а) 23. Декабря 2008 :: 09:05:
 Есть простой запрос, который по идее должен выводить только последний документ по каждому контрагенту из группы. Но в результате выводятся все документы по каждому контрагенту. Возможно ли выбрать только последний документ?

 |SELECT
 |MAX(CAST (LEFT(tp.date_time_docid, 8) as DateTime)) as ДатаДк ,
 |tp.ktsc0 AS Kt,
 | right(tp.date_time_docid,9) AS Док,  
 | jur.iddocdef As Док_вид,
 |SUM(tp.SUM_) AS sum_op  
 |FROM
 |  _1sentry AS tp (nolock),
 |_1sjourn AS  jur (nolock)
 | Where
 | (tp.date_time_docid=jur.date_time_iddoc) AND
 |  (jur.date_time_iddoc between Очень довольныйate01 and Очень довольныйate02 +  'ZZZZZZZZZZZZZZZ') AND
 |  (tp.KTSC0 IN (SELECT val FROM #ktg)) AND
 |  tp.accktid IN (SELECT val FROM #accs) AND
 |  ((tp.AccDtId IN (SELECT val FROM #accsd01)) OR (tp.AccDtId IN (SELECT val FROM #accsd02))) AND
 |  (tp.ACTIVE='')
 |GROUP BY  
 |tp.ktsc0,
 | right(tp.date_time_docid,9),
 | jur.iddocdef  

делай
|MAX(tp.date_time_docid) as ДатаДк


а как у тебя написано выдать все документы за максимальную дату
  
Наверх
 
IP записан
 
RuporAbsurda
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите с запросом
Ответ #2 - 23. Декабря 2008 :: 09:14
Печать  
Получается то же самое - все документы за период.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с запросом
Ответ #3 - 23. Декабря 2008 :: 09:14
Печать  
еще вместо
|  (jur.date_time_iddoc between Очень довольныйate01 and Очень довольныйate02 +  'ZZZZZZZZZZZZZZZ') AND


ИХМО гораздо лучше 
jur.date_time_iddoc  >= Очень довольныйate01
  
Наверх
 
IP записан
 
RuporAbsurda
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите с запросом
Ответ #4 - 23. Декабря 2008 :: 09:21
Печать  
Согласен чуть пошустрее такая конструкция должна работать, но проблема остается как вытащить лишь последний документ. Если бы контрагент был один можно было просто сделать SELECT TOP 1 ORDER BY ДатаДк DESC и все, но тут их список и такая конструкция не работает.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с запросом
Ответ #5 - 23. Декабря 2008 :: 09:34
Печать  
RuporAbsurda писал(а) 23. Декабря 2008 :: 09:21:
Согласен чуть пошустрее такая конструкция должна работать, но проблема остается как вытащить лишь последний документ. Если бы контрагент был один можно было просто сделать SELECT TOP 1 ORDER BY ДатаДк DESC и все, но тут их список и такая конструкция не работает.

вообще не понимаю почему клиент будет во всех документах ?
лучше еще раз опиши точно задачу
  
Наверх
 
IP записан
 
RuporAbsurda
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите с запросом
Ответ #6 - 23. Декабря 2008 :: 09:47
Печать  
Задача следующая
1. Есть несколько контрагентов
2. При оплате товара формируетя документ (Выписка, ПКО и т.д.)
3. Эти оплаты происходят в разные дни

Нужно для каждого контрагента показать когда и на какую сумму был ПОСЛЕДНИЙ платеж.

Контрагенты для ускорения процесса укладываются в список.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с запросом
Ответ #7 - 23. Декабря 2008 :: 09:55
Печать  
RuporAbsurda писал(а) 23. Декабря 2008 :: 09:47:
Задача следующая
1. Есть несколько контрагентов
2. При оплате товара формируетя документ (Выписка, ПКО и т.д.)
3. Эти оплаты происходят в разные дни

Нужно для каждого контрагента показать когда и на какую сумму был ПОСЛЕДНИЙ платеж.

Контрагенты для ускорения процесса укладываются в список.

покажи запрос который по спискку клиентов выдаст все документы >=  определенной даты
  
Наверх
 
IP записан
 
RuporAbsurda
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите с запросом
Ответ #8 - 23. Декабря 2008 :: 09:58
Печать  
Он в самом первом посте. Именно такой запрос и выдает все платежные документы по списку контрагентов (отбор идет по счетам 51 и 50)
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с запросом
Ответ #9 - 23. Декабря 2008 :: 10:45
Печать  
RuporAbsurda писал(а) 23. Декабря 2008 :: 09:58:
Он в самом первом посте. Именно такой запрос и выдает все платежные документы по списку контрагентов (отбор идет по счетам 51 и 50)

это не такой запрос.
в моем вопросе ( запросе ) нет сумм без них будет гораздо легче написать все. так что лучше перепиши его еще раз, а мы его еще раз поправим, может быть что нибудь и получиться.

  
Наверх
 
IP записан
 
RuporAbsurda
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите с запросом
Ответ #10 - 23. Декабря 2008 :: 11:13
Печать  
Без сумм будет вот так:
|SELECT
|CAST (LEFT(tp.date_time_docid, 8) as DateTime) as ДатаДк ,
|tp.ktsc0 AS Kt,
| right(tp.date_time_docid,9) AS Док, 
| jur.iddocdef As Док_вид,
|FROM
|  _1sentry AS tp (nolock),
|_1sjourn AS  jur (nolock)
| Where
| (tp.date_time_docid=jur.date_time_iddoc) AND
|  (jur.date_time_iddoc >Очень довольныйate01) AND
|  (tp.KTSC0 IN (SELECT val FROM #ktg)) AND
|  tp.accktid IN (SELECT val FROM #accs) AND
|  ((tp.AccDtId IN (SELECT val FROM #accsd01)) OR (tp.AccDtId IN (SELECT val FROM #accsd02))) AND
|  (tp.ACTIVE='')
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с запросом
Ответ #11 - 23. Декабря 2008 :: 11:18
Печать  
RuporAbsurda писал(а) 23. Декабря 2008 :: 11:13:
Без сумм будет вот так:
|SELECT
|CAST (LEFT(tp.date_time_docid, 8) as DateTime) as ДатаДк ,
|tp.ktsc0 AS Kt,
| right(tp.date_time_docid,9) AS Док,  
| jur.iddocdef As Док_вид,
|FROM
|  _1sentry AS tp (nolock),
|_1sjourn AS  jur (nolock)
| Where
| (tp.date_time_docid=jur.date_time_iddoc) AND
|  (jur.date_time_iddoc >Очень довольныйate01) AND
|  (tp.KTSC0 IN (SELECT val FROM #ktg)) AND
|  tp.accktid IN (SELECT val FROM #accs) AND
|  ((tp.AccDtId IN (SELECT val FROM #accsd01)) OR (tp.AccDtId IN (SELECT val FROM #accsd02))) AND
|  (tp.ACTIVE='')



упростим его
Код
Выбрать все
|SELECT
|CAST (LEFT(tp.date_time_docid, 16) as DateTime) as ДатаДк ,
|tp.ktsc0 AS Kt,
| right(tp.date_time_docid,9) AS Док
|FROM
|  _1sentry AS tp (nolock)
| Where
|  (tp.date_time_iddoc >ate01) AND
|  (tp.KTSC0 IN (SELECT val FROM #ktg)) AND
|  tp.accktid IN (SELECT val FROM #accs) AND
|  ((tp.AccDtId IN (SELECT val FROM #accsd01)) OR (tp.AccDtId IN (SELECT val FROM #accsd02))) AND
|  (tp.ACTIVE='') 


запрос правильный ?
и правильно ли отрабатывает на реальных данных ?
  
Наверх
 
IP записан
 
RuporAbsurda
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите с запросом
Ответ #12 - 23. Декабря 2008 :: 11:32
Печать  
Да почти правильный.
1. CAST (LEFT(tp.date_time_docid, 16) as DateTime) нужно не 16 а 8
2. tp.date_time_iddoc >ate01 нужно tp.date_time_docid>ate01
3. Если получать конкретный документ (right(tp.date_time_docid,9) AS [Док $Документ]) будет ругаться, что не найдено типизируещее поле.

Но для эксперимента можно использовать. Но все равно не понятно как выковырять последний документ.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Помогите с запросом
Ответ #13 - 23. Декабря 2008 :: 11:39
Печать  
Длина именно 16

Код
Выбрать все
|SELECT
|MAX(CAST (LEFT(tp.date_time_docid, 16) as DateTime)) ,
|tp.ktsc0 AS Kt,
| right(tp.date_time_docid,9) AS x_docid
|FROM
|  _1sentry AS tp (nolock)
| Where
|  (tp.date_time_docid >ate01) AND
|  (tp.KTSC0 IN (SELECT val FROM #ktg)) AND
|  tp.accktid IN (SELECT val FROM #accs) AND
|  ((tp.AccDtId IN (SELECT val FROM #accsd01)) OR (tp.AccDtId IN (SELECT val FROM #accsd02))) AND
|  (tp.ACTIVE='')
group by Kt,x_docid
 



проверяй этот запрос
он должен для каждого клиента выдать максимальный документ (
точнее не документ а его id )
  
Наверх
 
IP записан
 
RuporAbsurda
Senior Member
****
Отсутствует


I Love YaBB 2!

Сообщений: 413
Зарегистрирован: 29. Июня 2006
Re: Помогите с запросом
Ответ #14 - 23. Декабря 2008 :: 11:47
Печать  
Если ставить 16, то
Syntax error converting datetime from character string.
А откуда такая цифра 16? В этом поле 8 - дата 6- время и 9 id документа
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 
ОтправитьПечать