2015-09-30 2 views
0

Я пытаюсь создать столбец числителя (num) и знаменателя (den), который позже я буду использовать для создания значения показателя. В моей колонке числителя мне нужно иметь критерии, которые не имеют в моей колонке знаменателя. Когда я добавляю предложение where к моему второму запросу, я получаю ошибку ниже. Я не хочу добавлять INRInRange в мой оператор Group By.Подзапрос Где предложение недействительно в списке выбора

Колонка «dbo.PersonDetailB.INRInRange» недопустим в списке выбора, поскольку он не содержится ни в статистической функции или предложения GROUP BY.»

SELECT 
     dbo.PersonDetailSpecialty.PracticeAbbrevName, 
     (SELECT COUNT(DISTINCT dbo.Problem.PID) WHERE PersonDetailB.INRInRange='True') AS num, 
     COUNT(DISTINCT dbo.Problem.PID) AS den 
FROM   
     dbo.PersonDetailB 
RIGHT OUTER JOIN 
     dbo.PersonDetailSpecialty ON dbo.PersonDetailB.PID = dbo.PersonDetailSpecialty.PID 
LEFT OUTER JOIN 
     dbo.Problem ON dbo.PersonDetailSpecialty.PID = dbo.Problem.PID 

GROUP BY 
     practiceabbrevname 
+0

Replace с ' dbo.PersonDetailSpecialty.PracticeAbbrevName' с 'practiceabbrevname', – abatishchev

ответ

1

Создать подзапрос, который подсчитывает PersonDetailB.INRInRange и LEFT OUTER JOIN его с первоначальным запросом.

SELECT Main.PracticeAbbrevName, InRange.Num AS num, Main.den 
FROM 
    (SELECT 
      dbo.PersonDetailSpecialty.PracticeAbbrevName, 
      COUNT(DISTINCT dbo.Problem.PID) AS den 
    FROM   
      dbo.PersonDetailB 
    RIGHT OUTER JOIN 
      dbo.PersonDetailSpecialty ON dbo.PersonDetailB.PID = dbo.PersonDetailSpecialty.PID 
    LEFT OUTER JOIN 
      dbo.Problem ON dbo.PersonDetailSpecialty.PID = dbo.Problem.PID 
    GROUP BY 
      practiceabbrevname) Main 
    LEFT OUTER JOIN 
      (SELECT practiceabbrevname, COUNT(DISTINCT dbo.Problem.PID) Num WHERE PersonDetailB.INRInRange='True' GROUP BY practiceabbrevname) InRange ON Main.practiceabbrevname = InRange.practiceabbrevname 
+0

Вдоль этих строк я не мог просто присоединиться к таблице на PID = PID и INRInRange = 'True' –

+0

Да, вы могли бы это сделать. – coderboy

0

Проблема с этим заявление:

SELECT dbo.PersonDetailSpecialty.PracticeAbbrevName, 
     (SELECT COUNT(DISTINCT dbo.Problem.PID) WHERE PersonDetailB.INRInRange = 'True') AS num, 
     COUNT(DISTINCT dbo.Problem.PID) AS den 

что PersonDetailB.INRInRange1 не имеет уникальное значение в каждой группе Вполне возможно, что это делает один метод, чтобы добавить его к..:

GROUP BY practiceabbrevname, PersonDetailB.INRInRange 

Другой метод будет использовать агрегатную функцию в подзапрос:

SELECT dbo.PersonDetailSpecialty.PracticeAbbrevName, 
     (SELECT COUNT(DISTINCT dbo.Problem.PID) WHERE MAX(PersonDetailB.INRInRange) = 'True') AS num, 
     COUNT(DISTINCT dbo.Problem.PID) AS den 
+0

INRInRange - это немного да ta, поэтому оператор Max недействителен. –

+0

@JohnS. , , Как насчет добавления его в «GROUP BY»? –

0

Подключитесь к отдельной таблице в качестве другого имени, где критерии, которые были в подзапросе.

SELECT PersonDetailSpecialty.PracticeAbbrevName, 
      COUNT(PDTRUE.PID) as num, 
      COUNT(dbo.Problem.PID) AS den 

FROM  dbo.PersonDetailSpecialty LEFT OUTER JOIN 
      dbo.PersonDetailB as PDTRUE ON dbo.PersonDetailSpecialty.PID = PDTRUE.PID and PDTRUE.INRInRange='True' LEFT OUTER JOIN 
      dbo.PersonDetailB ON dbo.PersonDetailSpecialty.PID = PersonDetailB.PID LEFT OUTER JOIN 
      dbo.Medicate ON dbo.PersonDetailSpecialty.PID = dbo.Medicate.PID LEFT OUTER JOIN 
      dbo.Problem ON dbo.PersonDetailSpecialty.PID = dbo.Problem.PID 

GROUP BY PersonDetailSpecialty.PracticeAbbrevName 

Это соответствующий код, необходимый в из раздела

dbo.PersonDetailSpecialty LEFT OUTER JOIN dbo.PersonDetailB as PDTRUE 
ON dbo.PersonDetailSpecialty.PID = PDTRUE.PID and PDTRUE.INRInRange='True' 

Это позволяет добавлять

COUNT(PDTRUE.PID) as num, 

как простой части общего запроса на выборку

Смежные вопросы