Сумма агрегации более высокого уровня - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть таблица, определенная в приведенном ниже коде, я ожидаю, что сумма всех значений будет равна ALLDays, в данном случае для Ajan 36 и для Sam 21. Как я могу изменить приведенный ниже запрос, чтобы получить это?запрещено использовать функцию windows. Я могу выполнить требование, сгруппировав другой запрос по ученику и присоединившись к обоим, но есть ли способ изменить приведенный ниже запрос, чтобы удовлетворить требование.любая помощь очень ценится.

DECLARE @Table 
TABLE(Student varchar(50),
subject varchar(50)
,days int)

Insert into @Table
values('Ajan','English',8),('Ajan','Math',9),('Ajan','Science',7),('Ajan','English',5),('Ajan','Math',4),('Ajan','Science',3),
('Sam','English',7),('Sam','Math',6),('Sam','Science',8)


select student,subject,sum(days) as SubjectDays,'' as AllDays from @Table
group by student,subject  

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Возможно, вы можете использовать CTE для хранения общей суммы и присоединиться к ней:

DECLARE @Table 
TABLE(Student varchar(50),
subject varchar(50)
,days int)

Insert into @Table
values('Ajan','English',8),('Ajan','Math',9),('Ajan','Science',7),('Ajan','English',5),('Ajan','Math',4),('Ajan','Science',3),
('Sam','English',7),('Sam','Math',6),('Sam','Science',8);


WITH MainSummary (Student,Alldays) AS
(
	 SELECT Student,SUM([days]) as AllDays
	 FROM @Table
	 GROUP BY Student
)
SELECT 
	T.Student
	,T.[subject]
	,SUM([Days]) AS SubjectDays
	,MAX(MS.AllDays) AS AllDays
FROM @Table AS T
LEFT JOIN MainSummary AS MS ON MS.Student = T.Student
GROUP BY T.Student,T.[Subject]
0 голосов
/ 19 декабря 2018

После дополнительных поисков я определил способ удовлетворения требований без каких-либо объединений,

DECLARE @Table 
TABLE(Student varchar(50),
subject varchar(50)
,days int)

Insert into @Table
values('Ajan','English',8),('Ajan','Math',9),('Ajan','Science',7),('Ajan','English',5),('Ajan','Math',4),('Ajan','Science',3),
('Sam','English',7),('Sam','Math',6),('Sam','Science',8);

SELECT student,subject,sum(days) as SubjectDays,
    (SELECT sum(days) from  @Table b where b.Student=a.Student ) as Alldays 
    FROM @Table a
    group by student,subject  
0 голосов
/ 19 декабря 2018

Если вы не можете использовать оконные функции, то одной из альтернатив будет использование двух отдельных подзапросов для сумм дней на уровне ученика и предмета.

select t1.student, t1.subject, t1.SubjectDays, t2.AllDays
from
(
    select student, subject, sum(days) as SubjectDays
    from @Table
    group by student, subject
) t1
inner join
(
    select student, sum(days) as AllDays
    from @Table
    group by student
) t2
    on t1.student = t2.student;
...