Вычисляемое поле с использованием групп по подзапросам - PullRequest
0 голосов
/ 25 июня 2018

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

  Select a.FieldName, b.DepName, sum(LessonWeeklyTime), ((sum(LessonWeeklyTime))*100)/(select LessonDep, sum(LessonWeeklyTime) 
    From Lessons 
Group By LessonDep) 
    from Lessons l, Departments b, Fields a 
   Where l.LessonDep=b.DepId 
     And l.LessonField=a.FieldId 
Group By b.DepName,a.FieldName

Но я получаю ошибку:

Сообщение 116, Уровень 16, Состояние 1, Строка 2 Только одно выражение может быть указано в списке выбора, если подзапрос не введен с EXISTS.

Благодарю за помощь.

Ответы [ 4 ]

0 голосов
/ 25 июня 2018

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный, стандартный JOIN синтаксис.В конце концов, это 21 век.

Вы должны делать это с помощью оконных функций:

select f.FieldName, d.DepName, sum(LessonWeeklyTime), 
       (sum(LessonWeeklyTime) * 100.0 / 
        sum(sum(LessonWeeklyTime)) over (partition by d.depName)
from Lessons l join
     Departments d
     on l.LessonDep = d.DepId join
     Fields f
     on l.LessonField = f.FieldId 
Group By d.DepName, f.FieldName
0 голосов
/ 25 июня 2018

Проверьте это:

Select a.FieldName, b.DepName, sum(LessonWeeklyTime), ((sum(LessonWeeklyTime))*100)/ sum(c.LessonWeeklyTime)
        from Lessons l, Departments b, Fields a ,(select LessonDep, sum(LessonWeeklyTime) LessonWeeklyTime 
        From Lessons 
Group By LessonDep) c
       Where l.LessonDep=b.DepId 
         And l.LessonField=a.FieldId 
         And l.LessonDep=c.LessonDep
Group By b.DepName,a.FieldName
0 голосов
/ 25 июня 2018

Получает время по необходимым кодам из 1 таблицы и использует оконную функцию для процента.Он группирует / рассчитывает по идентификаторам, а не по описаниям, чтобы повысить производительность и уменьшить вероятность ошибок при неправильной маркировке / пустых значениях:

WITH CTE AS( SELECT LESSONDEP, LESSONFIELD, SUM(LESSONWEEKLYTIME) AS [TIME] 
FROM [LESSONS] 
GROUP BY LESSONDEP, LESSONFIELD) 
SELECT F.FIELDNAME, D.DEPNAME, L.[TIME], (L.[TIME]*100.0) / (SUM(L.[TIME]) OVER (PARTITION BY L.LESSONDEP) AS [PERCENTAGE] 
FROM CTE L 
INNER JOIN DEPARTMENTS D ON L.LESSONDEP = D.DEPID 
INNER JOIN FIELDS F ON L.LESSONFIELD = F.FIELDID
0 голосов
/ 25 июня 2018

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

Select a.FieldName, b.DepName, sum(LessonWeeklyTime), ((sum(LessonWeeklyTime))*100)/(select sum(LessonWeeklyTime) 
    From Lessons 
Group By LessonDep) 
    from Lessons l, Departments b, Fields a 
   Where l.LessonDep=b.DepId 
     And l.LessonField=a.FieldId 
Group By b.DepName,a.FieldName
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...