Niteshbagal Ответов: 2

Я хочу следующий SQL запрос в справке ms access plz


Я хочу следующий sql запрос в ms access

DECLARE @BreakFast INT =(SELECT  sum( OM.ItemQuantity)  FROM VW_EmpOrderMaster OM WHERE  OM.MealType=1 AND MONTH(OM.OrderTime)
	=MONTH(GETDATE()) 	 and day(OM.OrderTime)=day(GETDATE()) AND YEAR(OM.OrderTime)=YEAR(GETDATE()))
	DECLARE @Lunch INT =(SELECT  sum( OM.ItemQuantity)  FROM VW_EmpOrderMaster OM WHERE  OM.MealType=2 AND MONTH(OM.OrderTime)=MONTH(GETDATE()) 
		 and day(OM.OrderTime)=day(GETDATE()) AND YEAR(OM.OrderTime)=YEAR(GETDATE())) 

DECLARE @BreakFastvisitor INT =(SELECT  sum( OM1.ItemQuantity)  FROM VW_EmpOrderMaster_Visitor OM1 WHERE  OM1.MealType=1 AND MONTH(OM1.OrderTime)
	=MONTH(GETDATE()) 	 and day(OM1.OrderTime)=day(GETDATE()) AND YEAR(OM1.OrderTime)=YEAR(GETDATE()))
	DECLARE @Lunchvisitor INT =(SELECT  sum( OM1.ItemQuantity)  FROM VW_EmpOrderMaster_Visitor OM1 WHERE  OM1.MealType=2
	 AND MONTH(OM1.OrderTime)=MONTH(GETDATE())	 and day(OM1.OrderTime)=day(GETDATE()) 
	AND YEAR(OM1.OrderTime)=YEAR(GETDATE())) 


declare @totalbreakfast int=sum((ISNULL((@BreakFast), 0))+(ISNULL((@BreakFastvisitor), 0))) 
	declare @totalLunch int = sum((ISNULL((@Lunch), 0))+(ISNULL((@Lunchvisitor), 0)))

SELECT  

		 @totalbreakfast AS BreakFast,  
	 @totalLunch AS Lunch,  


Что я уже пробовал:

      ( (SELECT  sum( OM.ItemQuantity) as BreakFast FROM VW_EmpOrderMaster OM WHERE  OM.MealType=1  AND MONTH(OM.OrderTime)
	=MONTH(now()) 	 and day(OM.OrderTime)=day(now()) AND YEAR(OM.OrderTime)=YEAR(now())) union
(SELECT  sum( OM1.ItemQuantity) as BreakFast  FROM VW_EmpOrderMaster_Visitor OM1 WHERE  OM1.MealType=1 AND MONTH(OM1.OrderTime)
	=MONTH(now()) 	 and day(OM1.OrderTime)=day(now()) AND YEAR(OM1.OrderTime)=YEAR(now()))   )  

Kornfeld Eliyahu Peter

И что же? Здесь есть какие-то проблемы?

DerekT-P

Исходный запрос возвращает одну строку из 2 столбцов; ваша переработанная версия возвращает 2 строки по 1 столбцу в каждой. Что вам на самом деле нужно?

Niteshbagal

Мне нужны два столбца в результате которых в sql запросе

Dave Kreskowiak

Проблема с этим исходным кодом SQL заключается в том, что это процедура хранения, которую Access не поддерживает.

2 Ответов

Рейтинг:
1

DerekT-P

Как сказал Дэйв выше, ваш исходный код-это хранимая процедура, которую Access не поддерживает. Таким образом, вам нужно будет написать либо один запрос, который возвращает все ваши данные за один раз (без временных переменных, без временных таблиц), либо написать несколько запросов и вызвать один из них из другого.

Вы также должны знать о различиях в функциях; поэтому SQL Server использует GetDate(), тогда как Access использует NOW(). Вместо того чтобы тестировать элементы year/month/day отдельно, я бы посоветовал вам более читабельно (и более эффективно, и менее подвержено ошибкам) просто протестировать часть полей date, чтобы ваши тесты date стали и DATEVALUE(OM.OrderTime) = DATEVALUE(NOW())

Функция Access ISNULL просто возвращает значение True/False, поэтому вам нужно объединить его со встроенным оператором IIF. Одним из недостатков этого является то, что любые функции, вызываемые в функции ISNULL, должны быть повторены, если результат не равен нулю, поэтому существует потенциально значительное снижение производительности. Но эй, вы используете доступ, так что производительность явно не беспокоит вас.

Чтобы получить результат из двух столбцов, который вам нужен, и отделить компоненты обеда и завтрака (то есть некоторые строки вносят вклад в один столбец, другие строки-в другой), вам нужно будет использовать оператор CASE, тестируя тип еды. Access не поддерживает оператор CASE SQL Server, но у него есть переключатель, который мы можем использовать аналогичным образом.

Собрав все это вместе, мы получим что-то вроде:

SELECT IIF(ISNULL(SUM(SWITCH(OM.MealType=1,OM.ItemQuantity,OM.MealType=2,0))),0,SUM(SWITCH(OM.MealType=1,OM.ItemQuantity,OM.MealType=2,0))) AS Breakfast,
       IIF(ISNULL(SUM(SWITCH(OM.MealType=2,OM.ItemQuantity,OM.MealType=1,0))),0,SUM(SWITCH(OM.MealType=2,OM.ItemQuantity,OM.MealType=1,0))) AS Lunch
FROM VW_EmpOrderMaster OM 
WHERE (OM.MealType=1 OR OM.MealType=2)
AND DATEVALUE(OM.OrderTime)=DATEVALUE(NOW());
Это отделяет значения завтрака и обеда; фильтрует по дате только на сегодняшний день (я думаю, вы захотите параметризовать это, поэтому замените функцию NOW() соответствующим параметром запроса); дает нулевое значение, если нет найденных обедов/завтраков - и делает все это в одном запросе таблицы.

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

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

Надеюсь, вы сможете взять его отсюда.