Nilima Ukande Ответов: 1

Две функции подсчета не работают в select query.it дает ниже ошибку как "одно выражение может быть указано в списке выбора, когда подзапрос не введен с EXISTS"


Не в состоянии подсчитать разницу двух запросов select, теперь sql-запрос работает для
"только один счетчик", показывает ошибку после добавления дополнительной функции подсчета в запрос.Если есть какой-либо другой сценарий,чтобы найти разницу в 2 запроса, пожалуйста, предложите.

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

ВЫБИРАТЬ (

ВЫБИРАТЬ --Рек.gems_preservationmediaexpirationdate,отдых.те gems_name,.gems_name
-- COUNT (DISTINCT TE.gems_tissuedetailid) AS [Total Tissues],
Граф(отчетливый случай, когда функция datename(месяц, номер модели / ref.gems_deathnotificationdatetime) = "апрель" тогда те.gems_tissuedetailid конца) Как итог апреля тканей

Из Filteredgems_Referral как ссылка внутреннее соединение
FilteredBusinessUnit как БУ по реф.owningbusinessunit = БУ.businessunitid внутреннее соединение
Filteredgems_recovery как отдых на Реф.gems_referralid = отдых.gems_originatingrefferalid внутреннее соединение
Filteredgems_MedicalReview как господин на отдых.gems_recoveryid = г-gems_originatingrecoveryid внутреннее соединение
Filteredgems_TissueDetail как те на Г-gems_medicalreviewid = Тэ.gems_medicalreviewidid

Где (Ref.gems_deathnotificationdatetime не равно NULL)
И (Зап.gems_recoveryintent в ('1'))
И (функция datename(Год, Номер модели / ref.gems_deathnotificationdatetime) = '2017')
и TE. statecode in ('0')
) - (

ВЫБИРАТЬ -- Рек.gems_preservationmediaexpirationdate,отдых.gems_name
-- COUNT (DISTINCT TE.gems_tissuedetailid) AS [Total Tissues],
Граф(отчетливый случай, когда функция datename(месяц, номер модели / ref.gems_deathnotificationdatetime) = "апрель" тогда те.gems_tissuedetailid конца) Как итог апреля тканей
Из Filteredgems_Referral как ссылка внутреннее соединение
FilteredBusinessUnit как БУ по реф.owningbusinessunit = БУ.businessunitid внутреннее соединение
Filteredgems_recovery как отдых на Реф.gems_referralid = отдых.gems_originatingrefferalid внутреннее соединение
Filteredgems_MedicalReview как господин на отдых.gems_recoveryid = г-gems_originatingrecoveryid внутреннее соединение
Filteredgems_TissueDetail как те на Г-gems_medicalreviewid = Тэ.gems_medicalreviewidid

Где (Ref.gems_deathnotificationdatetime не равно NULL)
И (Зап.gems_recoveryintent в ('1'))
И (функция datename(Год, Номер модели / ref.gems_deathnotificationdatetime) = '2017')
И отдых.gems_preservationmediaexpirationdate &ГТ; функции getdate()

) как "просроченная ткань"

CHill60

Не ясно и невероятно трудно для нас воссоздать. Упростите свой запрос настолько, насколько сможете , предпочтительно удалив как можно больше соединений (все было бы лучше). Когда вы получите свой запрос как можно более простым, то перепечатайте его здесь, используя Улучшить вопрос ссылка. Также включите некоторые примеры данных.

1 Ответов

Рейтинг:
8

CHill60

Хорошо, я нашел очень простой пример, чтобы продемонстрировать, что происходит не так с вашими запросами.

Представьте себе такой простой стол:

CREATE TABLE [dbo].[Orders](
	[OrderID] [int] IDENTITY(1,1) NOT NULL,
	[CustomerID] [nchar](5) NULL,
	[OrderDate] [date] NULL
) ON [PRIMARY]

INSERT INTO ORDERS VALUES('VINET','1996-Jul-4')
INSERT INTO ORDERS VALUES('VINET','1996-Aug-6')
INSERT INTO ORDERS VALUES('VINET','1996-Sep-2')
INSERT INTO ORDERS VALUES('VINET','1997-Nov-11')
INSERT INTO ORDERS VALUES('VINET','1997-Nov-12')
Теперь представьте себе, что я хочу получить некоторые различия между некоторыми графами, как это:
SELECT 
(
	SELECT COUNT(distinct OrderID) AS A, COUNT( distinct CustomerID) AS B
	FROM ORDERS
)-(
	SELECT count(distinct OrderID) AS A, COUNT(distinct CustomerID) AS B
	FROM ORDERS WHERE DATEPART(YEAR, OrderDate) = 1996
)
Я получаю ту же ошибку, что и вы
Цитата:
Только одно выражение может быть указано в списке выбора, если подзапрос не введен с помощью EXISTS.
Но если я считаю только один пункт это работает:
SELECT 
(
	SELECT count(distinct OrderID) AS A
	FROM ORDERS
)-(
	SELECT count(distinct OrderID) AS A
	FROM ORDERS WHERE DATEPART(YEAR, OrderDate) = 1996
)
Несмотря на то, что говорится в сообщении об ошибке, мы все равно можем получить нужные значения, используя общие табличные выражения или используя подзапросы несколько иным способом.
Я собираюсь добавить дополнительный столбец к каждому подзапросу:
SELECT COUNT(distinct OrderID) AS A, COUNT( distinct CustomerID) AS B, 1 AS C
FROM ORDERS
и
SELECT count(distinct OrderID) AS A, COUNT(distinct CustomerID) AS B, 1 AS C
FROM ORDERS WHERE DATEPART(YEAR, OrderDate) = 1996
Теперь я могу объединить результаты каждого подзапроса в этом дополнительном столбце, например
;WITH C1 AS
(
	SELECT COUNT(distinct OrderID) AS A, COUNT( distinct CustomerID) AS B, 1 AS C
	FROM ORDERS
), C2 AS
(
	SELECT count(distinct OrderID) AS A, COUNT(distinct CustomerID) AS B, 1 AS C
	FROM ORDERS WHERE DATEPART(YEAR, OrderDate) = 1996
)
SELECT C1.A-C2.A, C1.B-C2.B
FROM C1
INNER JOIN C2 ON C1.C=C2.C
Или, если вы предпочитаете суб-запросов обобщенных табличных выражений
SELECT C1.A-C2.A, C1.B-C2.B
FROM (
	SELECT COUNT(distinct OrderID) AS A, COUNT( distinct CustomerID) AS B, 1 AS C
	FROM ORDERS
) AS C1
INNER JOIN (
	SELECT count(distinct OrderID) AS A, COUNT(distinct CustomerID) AS B, 1 AS C
	FROM ORDERS WHERE DATEPART(YEAR, OrderDate) = 1996
) AS C2 ON C1.C=C2.C
Таким образом, ваш запрос будет выглядеть примерно так:
SELECT  C1.[APR Total Tissues] - C2.[APR Total Tissues], C1.[another count] - C2.[another count]
FROM (

 SELECT 1 AS JoinColumn, 
 COUNT(what ever else you want to count) AS [another count],
 COUNT(DISTINCT CASE WHEN DATENAME(month, Ref.gems_deathnotificationdatetime) = 'April' THEN TE.gems_tissuedetailid END) AS 'APR Total Tissues'

 FROM Filteredgems_Referral AS Ref INNER JOIN
 FilteredBusinessUnit AS BU ON Ref.owningbusinessunit = BU.businessunitid INNER JOIN
 Filteredgems_recovery AS Rec ON Ref.gems_referralid = Rec.gems_originatingrefferalid INNER JOIN
 Filteredgems_MedicalReview AS MR ON Rec.gems_recoveryid = MR.gems_originatingrecoveryid INNER JOIN
 Filteredgems_TissueDetail AS TE ON MR.gems_medicalreviewid = TE.gems_medicalreviewidid 

 WHERE (Ref.gems_deathnotificationdatetime IS NOT NULL)
 AND (Rec.gems_recoveryintent IN ('1')) 
 AND (DATENAME(year, Ref.gems_deathnotificationdatetime) = '2017')
 and TE.statecode in ('0')
 ) AS C1 
 INNER JOIN (

 SELECT 1 AS JoinColumn, 
 COUNT(what ever else you want to count) AS [another count],
 COUNT(DISTINCT CASE WHEN DATENAME(month, Ref.gems_deathnotificationdatetime) = 'April' THEN TE.gems_tissuedetailid END) AS 'APR Total Tissues'
 FROM Filteredgems_Referral AS Ref INNER JOIN
 FilteredBusinessUnit AS BU ON Ref.owningbusinessunit = BU.businessunitid INNER JOIN
 Filteredgems_recovery AS Rec ON Ref.gems_referralid = Rec.gems_originatingrefferalid INNER JOIN
 Filteredgems_MedicalReview AS MR ON Rec.gems_recoveryid = MR.gems_originatingrecoveryid INNER JOIN
 Filteredgems_TissueDetail AS TE ON MR.gems_medicalreviewid = TE.gems_medicalreviewidid 

 WHERE (Ref.gems_deathnotificationdatetime IS NOT NULL)
 AND (Rec.gems_recoveryintent IN ('1')) 
 AND (DATENAME(year, Ref.gems_deathnotificationdatetime) = '2017')
 AND Rec.gems_preservationmediaexpirationdate > GETDATE()

 ) as C2 ON C1.JoinColumn=C2.JoinColumn


Nilima Ukande

Это решение очень полезно для меня. Спасибо за быстрый ответ.

CHill60

Хорошо-комментируйте, если у вас возникнут еще какие-то проблемы.
Это был ты, который понизил голос (1-звезда)?

Nilima Ukande

Рейтинг дан по ошибке & он не был редактируемым, я пытался изменить.На самом деле я хотел дать 5 звезд.

CHill60

Не беспокойся об этом :-) Если кто-то отрицает мои решения, меня больше интересует то, что они считали неправильным, чем фактическое голосование. Вы приняли это как ответ :большой палец вверх: