如何使用GROUP BY为不同的列获取多个SUM()

Mar*_*Sz. 5 sql t-sql sql-server group-by sum

这就是我所拥有的:

SELECT     
    SUBJECT_ID, SUM(SOMETABLE.COLUMN) AS HOURS, POINTS, SEMESTER_ID
FROM       
    SOME_TABLES
WHERE     
    (GROUP = (SELECT TOP (1) GROUP
              FROM SOMETABLE2
              WHERE (STUDENT_ID = 123)))
GROUP BY 
    SUBJECT_ID, POINTS, SEMESTER_ID
HAVING      
    (SUBJECT_ID = 782)
Run Code Online (Sandbox Code Playgroud)

此查询返回:

在此输入图像描述

我需要得到这个结果:

在此输入图像描述

为了得到这个结果我正在使用这个查询:

SELECT     
    SUBJECT_ID, SUM(SOMETABLE.COLUMN) AS HOURS,  
    SUM(SOMETABLE3.COLUMN) AS POINTS, SEMESTER_ID
FROM
    SOME_TABLES
WHERE     
    (GROUP = (SELECT TOP (1) GROUP
              FROM SOMETABLE2
              WHERE (STUDENT_ID = 123)))
GROUP BY 
    SUBJECT_ID, SEMESTER_ID
HAVING      
    (SUBJECT_ID = 12)
Run Code Online (Sandbox Code Playgroud)

但它返回时SUM没有包含GROUP BY声明 - 就像第二次截图一样,但有两次有16点,而每学期应该有两行8点.

如何获得SEMESTER_ID的正确点?在这篇文章中有评论样本数据的脚本.

Sta*_*vas 0

您可以使用OVER子句,例如:

询问

select distinct 
       Id,
       sum(Hours) over (partition by SimId) Hours,
       sum(Points) over (partition by SimId) Points,
       SimId  
from #t
Run Code Online (Sandbox Code Playgroud)

样本数据

create table #t
(
    Id INT,
    Hours INT,
    Points INT, 
    SimId INT
)

insert into #t values
(787,100,0,214858),
(787,0,8,214858),
(787,100,8,233562),
(787,0,0,233562)
Run Code Online (Sandbox Code Playgroud)

输出

Id  Hours   Points  SimId
787 100     8       214858
787 100     8       233562
Run Code Online (Sandbox Code Playgroud)

更新

因为您没有提供示例数据,所以您可以执行CTE以下操作:

WITH cte AS
(
SELECT     
    SUBJECT_ID, SUM(SOMETABLE.COLUMN) AS HOURS,  
    SUM(SOMETABLE3.COLUMN) AS POINTS, SEMESTER_ID
FROM
    SOME_TABLES
WHERE     
    (GROUP = (SELECT TOP (1) GROUP
              FROM SOMETABLE2
              WHERE (STUDENT_ID = 123)))
GROUP BY 
    SUBJECT_ID, SEMESTER_ID
HAVING      
    (SUBJECT_ID = 12)
)
SELECT DISTINCT SUBJECT_ID,
       sum(Hours) over (partition by SEMESTER_ID) Hours,
       sum(Points) over (partition by SEMESTER_ID) Points,
       SEMESTER_ID  
FROM cte
Run Code Online (Sandbox Code Playgroud)

更新2

#temp_table您可以在选择查询中创建并插入数据,然后将其用于CTE以下情况:

;WITH cte AS
(
SELECT * 
FROM #temp_table
)
SELECT DISTINCT SUBJECT_ID,
       sum(Hours) over (partition by SEMESTER_ID) Hours,
       sum(Points) over (partition by SEMESTER_ID) Points,
       SEMESTER_ID  
FROM cte
Run Code Online (Sandbox Code Playgroud)