Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запрос на объединение [D6, dBase, FoxPro]


V-A-V ©   (2006-05-18 07:39:00) 

Доброе всем время суток.
Народ подскажите как можно попороть ошибку?
Есть запрос на объединение, вот текст


Select 0 as SNGDR, 0 as SNGKR, Sum(Summa) as SDR, 0 as SKR
From MB_2006
Where ((Left(Account,2)="51") or (Left(Account,4)="51")) and
     (Left(AccountK,2)<>"00") and  (Data < {03/31/2006})

Union  All

Select 0 as SNGDR, 0 as SNGKR, 0 as SDR, Sum(Summa) as SKR
From MB_2006
Where ((Left(AccountK,2)="51") or (Left(AccountK,4)="51")) and
     (Left(Account,2)<>"00")   and  (Data < {03/31/2006})


По отдельности каждый из них отрабатывает отлично, а вот при объединении кидает ошибку:

Поставщик данных или другая служба вернули состояние E_FAIL


Как это бобороть ума не приложу!


sniknik   (2006-05-18 13:18:00) [1]

нда, не все кавычки убрал, уточнение
Select 0 as SNGDR, 0 as SNGKR, Sum(Summa) as SDR, Sum(0) as SKR
From mb_2006
Where Data < {04/20/2006} and Left(Account,2)="51" and Left(AccountK,2)<>"00"

Union  All

Select 0, 0, 0, Sum(Summa)
From mb_2006
Where Data < {04/20/2006} and Left(AccountK,2)="51" and Left(Account,2)<>"00"


sniknik   (2006-05-18 13:15:00) [2]

> без Sum не работает!
тогда во втором запросе Sum у констант лишнее, если получается я прав, формат полей определяется первым запросом.

> значение 51 - это переменная длиной 2 или 4 цифири
обрезаные слева (Left) 2 символа, в любом случае дадут не больше 2 "цифирей".
говорю же, частный случай. или убери это обрезание, а т.к. это вычисление то убрав его заставиш индекс работать (если он есть).

равнозначный твоему запрос, должон работать, причем чуток быстрее
Select 0 as SNGDR, 0 as SNGKR, Sum(Summa) as SDR, Sum(0) as SKR
From mb_2006
Where Data < {04/20/2006} and (Left(Account,2)="51" and Left(AccountK,2)<>"00"

Union  All

Select 0, 0, 0, Sum(Summa)
From mb_2006
Where Data < {04/20/2006} and Left(AccountK,2)="51") and Left(Account,2)<>"00"


V-A-V   (2006-05-18 13:00:00) [3]

> (Left(Account,2)="51") or (Left(Account,4)="51")
>предлагаю еще помедитировать над этой конструкцией... дополнительно, "до просветления"

не, не получится
значение 51 - это переменная длиной 2 или 4 цифири


V-A-V   (2006-05-18 12:58:00) [4]

без Sum не работает!


Johnmen   (2006-05-18 12:37:00) [5]


> V-A-V ©   (18.05.06 12:00) [4]


А без Sum не работает?


sniknik   (2006-05-18 12:09:00) [6]

> (Left(Account,2)="51") or (Left(Account,4)="51")
предлагаю еще помедитировать над этой конструкцией... дополнительно, "до просветления"


V-A-V   (2006-05-18 12:00:00) [7]

Благодарю за помощь. Вот в таком виде все работает.

Select Sum(0.00) as SNGDR, Sum(0.00) as SNGKR, Sum(Summa) as SDR, Sum(0.00) as SKR
From mb_2006
Where (Data < {04/20/2006}) and
     ((Left(Account,2)="51") or (Left(Account,4)="51")) and
     (Left(AccountK,2)<>"00")

Union  All

Select Sum(0.00) as SNGDR, Sum(0.00) as SNGKR, Sum(0.00) as SDR, Sum(Summa) as SKR
From mb_2006
Where (Data < {04/20/2006}) and
     ((Left(AccountK,2)="51") or (Left(AccountK,4)="51")) and
     (Left(Account,2)<>"00")


sniknik   (2006-05-18 11:29:00) [8]

> ((Left(Account,2)="51") or (Left(Account,4)="51"))
второе условие это частный случай первого (т.е. второе сдесь бессмысленно, раз есть проверка первого)

на Data есть индекс? поставь условие (Data < {03/31/2006}) первым, на всякий случай... остальные вычисляемые, индекс не используют даже если есть, т.е. если используемый sql движок "глупый", без анализа/плана выражения, то в этом случае по твоему будет полный скан таблици.

по ошибке: поставь в первом запросе вместо 0 например Sum(0) т.к. 0 константа и возможно поле получает признак "константности"/ридонли а у тебя после этому полю со второго рекордсета другая сумма "пристегивается".


Johnmen   (2006-05-18 11:03:00) [9]

Возможно, будет достаточно указывать 0.0вместо 0


ЮЮ   (2006-05-18 10:54:00) [10]

0 as SKR в первом запросе и Sum(Summa) as SKR во втором, естественно, разного типа. Приведи 0 к типу поля Summa


Наверх

Титульная страница Поиск, карта сайта Написать письмо