Страница 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 скрипт на создание этих таблиц в БД