Запросы ...

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Запросы ...

Сообщение Admin »

Как сделать правильно вот такой запрос?

Код: Выделить всё

SELECT g.GoodsName,
(SELECT TOP 1 i.Price FROM ns_incomedet i WHERE i.GoodsID=g.ID
ORDER BY i.UpdateDateTime DESC) AS Price,
(SELECT SUM(i.Amount) FROM ns_incomedet i WHERE i.GoodsID=g.ID) AS Credit,
(SELECT SUM(o.Amount) FROM ns_outlaydet o WHERE o.GoodsID=g.ID) AS Debit,
(SELECT SUM(i.Amount) FROM ns_incomedet i WHERE i.GoodsID=g.ID) -
(SELECT SUM(o.Amount) FROM ns_outlaydet o WHERE o.GoodsID=g.ID) AS Balance
FROM ns_goods g
Хотелось сделать вот так но не получилось ...

Код: Выделить всё

SELECT g.GoodsName,
(SELECT TOP 1 i.Price FROM ns_incomedet i WHERE i.GoodsID=g.ID
ORDER BY i.UpdateDateTime DESC) AS Price,
(SELECT SUM(i.Amount) FROM ns_incomedet i WHERE i.GoodsID=g.ID) AS Credit,
(SELECT SUM(o.Amount) FROM ns_outlaydet o WHERE o.GoodsID=g.ID) AS Debit,
Credit - Debit AS Balance
FROM ns_goods g
и собственно самое важное ...
получается что когда вычитаем из числа NULL то получаем в результате NULL :(
Т.е. если у меня есть приход но нет расхода, я получу NULL а не остаток ... как это порешать?
ISNULL так как я пробовал не помогает.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Ravenous
Бывалый
Сообщения: 56
Зарегистрирован: 06 Июль 2005, 14:25
Откуда: Москва

Сообщение Ravenous »

Нет SQL' ля, чтобы сейчас проверить, но я бы попробывал так

Код: Выделить всё

SELECT g.GoodsName, i.Price, 
SUM(ISNULL(i.Amount,0.00)) as Credit, 
SUM(ISNULL(o.Amount,0.00)) as Debet,
SUM(ISNULL(i.Amount,0.00)) - SUM(ISNULL(o.Amount,0.00)) as Balance,
Max(i.UpdateDateTime)
FROM ns_goods as g
Left Join ns_incomedet as i On i.GoodsID=g.ID
Left Join ns_outlaydet as o On o.GoodsID=g.ID
Group By g.GoodsName, i.Price
Благодарень за терпение и понимание.

Изображение
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Спасибо. Попробую!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Все работает хорошо. Спасибо!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Поспешил я немного. Запрос работает не правильно.
Во первых товар групируется по названию и цене а мне нужно получить товар с последней ценой по приходу...
И еще при неравном количестве приходных записей и расходных неправильно считается Credit и Debet ...

Первый мой селект работал точно. Только не мог вычитать NULL а тут совсем плохо что-то.

Если кто сможет помочь могу на мыло кинуть или на сайт SQL файл с табличками и данными...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Вот так вот все работает как нужно ... хотя и не красивый запрос ...

Код: Выделить всё

SELECT g.GoodsName,
(SELECT TOP 1 i.Price FROM ns_incomedet i WHERE i.GoodsID=g.ID
ORDER BY i.UpdateDateTime DESC) AS Price,
(SELECT ISNULL(SUM(i.Amount),0.00) FROM ns_incomedet i WHERE i.GoodsID=g.ID) AS Credit,
(SELECT ISNULL(SUM(o.Amount),0.00) FROM ns_outlaydet o WHERE o.GoodsID=g.ID) AS Debit,
(SELECT ISNULL(SUM(i.Amount),0.00) FROM ns_incomedet i WHERE i.GoodsID=g.ID) -
(SELECT ISNULL(SUM(o.Amount),0.00) FROM ns_outlaydet o WHERE o.GoodsID=g.ID) AS Balance
FROM ns_goods g
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

когда мне надо вытащить из таблицы что то за максимальную - последнюю дату я делаю следующим образом

Код: Выделить всё

SELECT A.Rezult from myTable A where
 A.DateTimeField in (select max(B.DateTimeField) from myTable B where A.TovarCode = B.Tovar.Code) and A.TovarCode = Требуемый
в этом случае мы получим только одно значение

в твоих же вариантах - вложеные SELECTы могут вернуть больше одной записи и результирующий SELECT может дать ошибку - to many rows, все вложенные SELECTы должны возвращать одно значение

и честно говоря, сколько пишу под SQL, чтобы в место колонки писать SELECT - очень редко, в большинстве случаев спасают JOINы
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Все прекрасно работает. С данными.
И возвращает нужный мне результат :)

А по другому написать у меня не получается...
И повторюсь могу кинуть структуру с данными :):):)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Re: Запросы ...

Сообщение Andrew™ »

Admin писал(а):Как сделать правильно вот такой запрос?

Код: Выделить всё

SELECT g.GoodsName,
(SELECT TOP 1 i.Price FROM ns_incomedet i WHERE i.GoodsID=g.ID
ORDER BY i.UpdateDateTime DESC) AS Price,
(SELECT SUM(i.Amount) FROM ns_incomedet i WHERE i.GoodsID=g.ID) AS Credit,
(SELECT SUM(o.Amount) FROM ns_outlaydet o WHERE o.GoodsID=g.ID) AS Debit,
(SELECT SUM(i.Amount) FROM ns_incomedet i WHERE i.GoodsID=g.ID) -
(SELECT SUM(o.Amount) FROM ns_outlaydet o WHERE o.GoodsID=g.ID) AS Balance
FROM ns_goods g
ВОТ ТАК:

Код: Выделить всё

SELECT a.GoodsName,
       b.Price,
       SUM(d.Amount) as Credit,
       SUM(e.Amount) as Debit,
       ISNULL(SUM(d.Amount),0) - ISNULL(SUM(e.Amount),0) as Balance
 FROM ns_goods a
  left outer join ns_incomedet b
    on b.GoodsID=a.ID and b.UpdateDateTime in (select MAX(c.UpdateDateTime) from ns_incomedet c where c.GoodsID = a.ID)
  left outer join ns_incomedet d on d.GoodsID=a.ID   
  left outer join ns_outlaydet e on e.GoodsID=a.ID   
  group by A.GoodsName,b.Price
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

ВОТ ТАК:
Данный запрос и близко не работает так как нужно ...
Записи по расходу дублируются и т.д. :(
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Ravenous
Бывалый
Сообщения: 56
Зарегистрирован: 06 Июль 2005, 14:25
Откуда: Москва

Сообщение Ravenous »

Admin писал(а):Если кто сможет помочь могу на мыло кинуть или на сайт SQL файл с табличками и данными...
Положи куда-нибудь, завтра если будет время потренеруюсь. :)
IMHO, такой запрос как у тебя совсем не красивый :(
Хоть и работает как тебе хочется :)))
Благодарень за терпение и понимание.

Изображение
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Admin писал(а):
ВОТ ТАК:
Данный запрос и близко не работает так как нужно ...
Записи по расходу дублируются и т.д. :(
тогда совсем непонятно структура и наполнение БД, давай backup базы, гляну
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Положи куда-нибудь, завтра если будет время потренеруюсь.
IMHO, такой запрос как у тебя совсем не красивый
Хоть и работает как тебе хочется
тогда совсем непонятно структура и наполнение БД, давай backup базы, гляну
Постараюсь сегодня/завтра выложить ...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 3960
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 25 раз
Поблагодарили: 22 раза
Контактная информация:

Сообщение Admin »

Господа чем сделать Backup нескольких таблиц с сервера в файл который я могу по почте отправить?
Так что бы вы смогли его развернуть ...

У меня есть:
SQL Server Enterprise Manager
и
EMS SQL Manager

как это сделать... немного по пунктам!

то что есть в "Enterprise Manager" вроде может только всю базу бекапить ...
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 16:32
Откуда: Москва, Зеленоград

Сообщение Andrew™ »

Admin писал(а):Господа чем сделать Backup нескольких таблиц с сервера в файл который я могу по почте отправить?
Так что бы вы смогли его развернуть ...

У меня есть:
SQL Server Enterprise Manager
и
EMS SQL Manager

как это сделать... немного по пунктам!

то что есть в "Enterprise Manager" вроде может только всю базу бекапить ...
в EM есть понятие Export и Import, можно определённые таблицы залить в CSV, дай эти CSV + SQL скрипт на создание этих таблиц в БД
Ответить