Страница 1 из 2
Запросы ...
Добавлено: 29 Август 2006, 10:19
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 так как я пробовал не помогает.
Добавлено: 29 Август 2006, 12:02
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
Добавлено: 29 Август 2006, 12:37
Admin
Спасибо. Попробую!
Добавлено: 30 Август 2006, 3:29
Admin
Все работает хорошо. Спасибо!
Добавлено: 30 Август 2006, 8:24
Admin
Поспешил я немного. Запрос работает не правильно.
Во первых товар групируется по названию и цене а мне нужно получить товар с последней ценой по приходу...
И еще при неравном количестве приходных записей и расходных неправильно считается Credit и Debet ...
Первый мой селект работал точно. Только не мог вычитать NULL а тут совсем плохо что-то.
Если кто сможет помочь могу на мыло кинуть или на сайт SQL файл с табличками и данными...
Добавлено: 30 Август 2006, 8:26
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
Добавлено: 30 Август 2006, 8:36
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ы
Добавлено: 30 Август 2006, 10:57
Admin
Все прекрасно работает. С данными.
И возвращает нужный мне результат
А по другому написать у меня не получается...
И повторюсь могу кинуть структуру с данными

:):)
Re: Запросы ...
Добавлено: 30 Август 2006, 16:21
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
Добавлено: 31 Август 2006, 9:43
Admin
ВОТ ТАК:
Данный запрос и близко не работает так как нужно ...
Записи по расходу дублируются и т.д.

Добавлено: 31 Август 2006, 21:28
Ravenous
Admin писал(а):Если кто сможет помочь могу на мыло кинуть или на сайт SQL файл с табличками и данными...
Положи куда-нибудь, завтра если будет время потренеруюсь.

IMHO, такой запрос как у тебя совсем не красивый
Хоть и работает как тебе хочется

))
Добавлено: 01 Сентябрь 2006, 8:21
Andrew™
Admin писал(а):ВОТ ТАК:
Данный запрос и близко не работает так как нужно ...
Записи по расходу дублируются и т.д.

тогда совсем непонятно структура и наполнение БД, давай backup базы, гляну
Добавлено: 01 Сентябрь 2006, 8:36
Admin
Положи куда-нибудь, завтра если будет время потренеруюсь.
IMHO, такой запрос как у тебя совсем не красивый
Хоть и работает как тебе хочется
тогда совсем непонятно структура и наполнение БД, давай backup базы, гляну
Постараюсь сегодня/завтра выложить ...
Добавлено: 01 Сентябрь 2006, 8:53
Admin
Господа чем сделать Backup нескольких таблиц с сервера в файл который я могу по почте отправить?
Так что бы вы смогли его развернуть ...
У меня есть:
SQL Server Enterprise Manager
и
EMS SQL Manager
как это сделать... немного по пунктам!
то что есть в "Enterprise Manager" вроде может только всю базу бекапить ...
Добавлено: 01 Сентябрь 2006, 9:15
Andrew™
Admin писал(а):Господа чем сделать Backup нескольких таблиц с сервера в файл который я могу по почте отправить?
Так что бы вы смогли его развернуть ...
У меня есть:
SQL Server Enterprise Manager
и
EMS SQL Manager
как это сделать... немного по пунктам!
то что есть в "Enterprise Manager" вроде может только всю базу бекапить ...
в EM есть понятие Export и Import, можно определённые таблицы залить в CSV, дай эти CSV + SQL скрипт на создание этих таблиц в БД