KriShna RaJendra N PraSad Ответов: 3

Проблема с Sql-запросом ..................


уважаемый друг,

Я запускаю нижеприведенный запрос в sql, но он выдает нижеприведенную ошибку.

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.


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

SELECT b.Service_Name, c.Service_Type, Application_No, Reg_No, Student_Name,(select CONVERT(CHAR(10), dt+(select count(1) from Holiday_list 
where Date_Fmt between School_update and dt ),103) cnt from (select case when Service_TypeID='1' then (School_update + 30)  else (School_update + 5) end as dt from Application_Status)a) as Nxt_date, DATEDIFF(DAY, School_update, GETDATE()) as Day_Count, Created_Date, School_Code, 
case when Payment_Status='Y' then 'PAID'  when Payment_Status='N' then 'NOT PAID' END as Payment_Status 
FROM Application_Status a,MST_Service b,MST_ServiceType c,KSEEBMASTERS.dbo.MST_SCHOOL s ,MST_Division d 
where a.Service_ID=b.Service_ID and  s.SCM_SCHOOL_CODE collate Latin1_General_CI_AI=a.School_Code and s.DIST_CODE collate Latin1_General_CI_AI=d.DistrictCode 
and a.Service_TypeID=c.Type_ID and d.DivisionCode='ED' and Payment_Status='Y' and school_status='Y' and Div_Status='N'


Редактирование - от ООО " ОП " комментарии
Моя ошибка заключается только в следующем запросе.
select CONVERT(CHAR(10), dt+(select count(*) from Holiday_list where Date_Fmt between School_update and dt ),103) cnt from (select case when Service_TypeID='1' then (School_update + 30) else (School_update + 5) end as dt,School_update from Application_Status)a

Holiday_list

Date_Fmt Holiday_Name
2020-10-02 Gandhi Jayanthi
2020-10-04 Sunday
2020-10-10 Second Saturday
2020-10-11 Sunday
2020-10-18 Sunday
2020-10-24 Fourth Saturday
2020-10-25 Sunday
2020-10-26 Vijayadashami
2020-10-30 Ed Milad
2020-10-31 Valmiki Jayanthi
2020-11-01 Sunday
2020-11-08 Sunday
2020-11-14 Second Saturday
2020-11-15 Sunday
2020-11-16 Balipadyami
2020-11-22 Sunday
2020-11-28 Fourth Saturday
2020-11-29 Sunday
2020-12-03 Kanakadasa Jayanthi
2020-12-06 Sunday
2020-12-12 Second Saturday
2020-12-13 Sunday
2020-12-20 Sunday
2020-12-25 Christmas
2020-12-26 Fourth Saturday
2020-12-27 Sunday
это одна таблица, а другая находится ниже
Application_Status

Application_No School_update
202010090351001 2020-10-09 16:06:42.187
202010090552001 2020-10-09 17:49:54.037
Здесь мне нужно распечатать рабочий день, пропустив праздники, и есть идентификатор службы, для которого мы должны рассчитать 30 дней, а для 2-5 дней.
Application_No Service_TypeID School_update
202010090351001 1 2020-10-09 16:06:42.187
202010090552001 2 2020-10-09 17:49:54.037

F-ES Sitecore

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

KriShna RaJendra N PraSad

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

выберите CONVERT(CHAR(10), dt+(select count(*) from Holiday_list where Date_Fmt between School_update and dt ),103) cnt from (select case when Service_TypeID='1' then (School_update + 30) else (School_update + 5) end as dt,School_update from Application_Status)a

Здесь Application_Status-это одна таблица с именем столбца School_Update, а Holiday_List-другая таблица с именем столбца Date_Fmt.

CHill60

Можете ли вы дать нам некоторые примеры данных и результаты, которые вы ожидаете от этого образца - используйте ссылку "улучшить вопрос", чтобы добавить его к вашему вопросу

KriShna RaJendra N PraSad

конечно

KriShna RaJendra N PraSad

Holiday_list

Date_Fmt Имя_праздника
2020-10-02 Ганди Джаянти
2020-10-04 воскресенье
2020-10-10 Вторая Суббота
2020-10-11 воскресенье
2020-10-18 воскресенье
2020-10-24 Четвертая Суббота
2020-10-25 воскресенье
2020-10-26 Виджаядашами
2020-10-30 Эд Милад
2020-10-31 Вальмики Объектов:
2020-11-01 воскресенье
2020-11-08 воскресенье
2020-11-14 Вторая Суббота
2020-11-15 воскресенье
2020-11-16 Балипадями
2020-11-22 воскресенье
2020-11-28 Четвертая Суббота
2020-11-29 воскресенье
2020-12-03 Kanakadasa Объектов:
2020-12-06 воскресенье
2020-12-12 Вторая Суббота
2020-12-13 воскресенье
2020-12-20 воскресенье
2020-12-25 Рождество
2020-12-26 Четвертая Суббота
2020-12-27 воскресенье

это одна таблица, а другая находится ниже

Application_Status

School_update Application_No
202010090351001 2020-10-09 16:06:42.187
202010090552001 2020-10-09 17:49:54.037

KriShna RaJendra N PraSad

Здесь мне нужно распечатать рабочий день, пропустив праздники, и есть идентификатор службы, для которого мы должны рассчитать 30 дней, а для 2-5 дней.

Application_No Service_TypeID School_update
202010090351001 1 2020-10-09 16:06:42.187
202010090552001 2 2020-10-09 17:49:54.037

3 Ответов

Рейтинг:
1

OriginalGriff

Сообщение об ошибке довольно явное:

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

То, что он говорит, что вы не можете этого сделать:
SELECT A, (SELECT B FROM BTable) FROM ATable
Если только ... BTable Запрос SELECT всегда возвращает одно единственное значение.
И это по уважительной причине: если ATable запрос возвращает одно значение, а BTable запрос возвращает два, SQL понятия не имеет, что отображать в одной строке!

Почти наверняка, вместо подзапроса и длинного списка таблиц для выбора:
SELECT ... FROM Application_Status a,MST_Service b,MST_ServiceType c,KSEEBMASTERS.dbo.MST_SCHOOL s ,MST_Division d 
where ...
Вам нужно более тщательно продумать свои отношения с данными и использовать соединения для извлечения связанных данных: SQL-соединения[^]


Рейтинг:
1

CHill60

В дополнение к превосходному ответу @OriginalGriff рассмотрим следующий запрос

select Application_No, Date_fmt
from Application_Status 
cross join holiday_list
Он даст вам каждый из праздников для каждого из приложений (будьте осторожны с большими наборами данных, вы захотите отфильтровать соединение).

Подключите некоторые критерии, чтобы получить только те праздники, которые вас интересуют для каждого приложения, например
select Application_No, COUNT(*) as cnt 
from @Application_Status 
cross join @holiday_list
WHERE Date_Fmt BETWEEN School_update AND case when Service_TypeID='1' then (School_update + 30)  else (School_update + 5) end 
group by Application_No
Это теперь даст вам один строка для каждой заявки с подсчетом количества праздничных дней между соответствующими датами, определяемыми типом услуги.

Вы можете использовать этот запрос в общем табличном выражении или временной таблице или подзапросе, чтобы соединить его с другими вашими данными, например, здесь он используется в качестве подзапроса (обратите внимание, что я показал соединения с другими таблицами, но они закомментированы, потому что вы не предоставили никакой информации о них)
SELECT a.Application_No, 
		School_update + cnt as Nxt_date, 
		DATEDIFF(DAY, School_update, GETDATE()) as Day_Count
FROM 
	@Application_Status a
	--INNER JOIN MST_Service b ON a.Service_ID=b.Service_ID
	--INNER JOIN MST_ServiceType c ON a.Service_TypeID=c.Type_ID
	--INNER JOIN KSEEBMASTERS.dbo.MST_SCHOOL s ON s.SCM_SCHOOL_CODE collate Latin1_General_CI_AI=a.School_Code 
	--INNER JOIN MST_Division d ON s.DIST_CODE collate Latin1_General_CI_AI=d.DistrictCode
	INNER JOIN (select Application_No, COUNT(*) as cnt
			from @Application_Status cross join @holiday_list
			WHERE Date_Fmt BETWEEN School_update AND case when Service_TypeID='1' then (School_update + 30)  else (School_update + 5) end 
			group by Application_No ) aa on a.Application_No = aa.Application_No
--where d.DivisionCode='ED' and Payment_Status='Y' and school_status='Y' and Div_Status='N'


Рейтинг:
0

Gerry Schmitz

Я бы просто сгенерировал записи "сервисного дня" из таблицы "сервис", добавил их в "праздничный стол" и пошел оттуда.