对具有相同ID和不同列的列求和?

时间:2017-10-31 17:39:30

标签: sql sql-server tsql join sum

使用Microsoft SQL Server

我需要创建一个从临时表中获取用户ID的表。仅收集那些用户ID,然后将该个人用户的所有积分一起添加。

临时表,其中提取了每个用户ID的所有最新记录。

User ID | Points | Date Field   
-----------------------------
1           1      10/31/2016       
3           1      08/26/2016       

主要

User ID | Points | Date Field  | Other Field
--------------------------------------------
 1          1      10/31/2016      N/A
 1          2      10/25/2016      N/A      
 1          3      09/18/2016      N/A     
 2          1      08/17/2017      N/A     
 2         16      07/11/2017      N/A     
 3          1      08/27/2016      N/A       
 3          5      05/14/2016      N/A       

因此,请使用临时表并将这些用户ID与主表进行匹配。从该数据中,您应该只收集与临时表中的记录ID匹配的数据。然后,报告将分解为如下所示。其中显示了最近的日期,以及该用户ID的所有点的总和。

User ID  | Points | Date Field  | Other Field
---------------------------------------------
  1         6      10/31/2016       N/A  
  3         6      08/27/2016       N/A   

我试过这个SQL:

SELECT
    a.[User ID], a.[Points], a.[Date Field], a.[Other Field1], a.[Other Field2], a.[Other Field3], 
    (CASE WHEN b.[User ID] = a.[User ID] THEN SUM(a.Points) END) AS [Total Points]
FROM
    Main_Table a
INNER JOIN
    #Temp b ON b.[User ID] = a.[User ID]
GROUP BY 
    a.[User ID], [Points], [Date Field], [Other Field1], [Other Field2], [Other Field3]

我获得了总积分列,但未将所有具有相同用户ID的字段添加到一起。

我只需要知道我哪里出错了。我不是最好的SQL,而且我还在学习。请理解我正在尽力解决这个问题。

谢谢!

3 个答案:

答案 0 :(得分:0)

我想像你正在寻找的东西是这样的:

SELECT
    b.[User ID]
    , b.[Points]
    , b.[Date Field]
    , m.[Other_Field] -- etc.
    , SUM(a.Points) [Total Points]
FROM
    #Temp b
    INNER JOIN Main_Table m ON
        b.[User ID] = m.[User ID]
        AND b.[Date Field] = m.[Date Field]
    INNER JOIN Main_Table a ON b.[User ID] = a.[User ID]
GROUP BY
    b.[User ID]
    , b.[Points]
    , b.[Date Field]
    , m.[Other_Field]

但问题是,您想要保留Main_Table中的哪些其他字段?

我想可能是这样的:

{{1}}

答案 1 :(得分:0)

要获得Sum,您必须按不变的字段进行分组。因此,用户ID是您希望SUM by的不变字段。 group by完成此非聚合字段用户ID。日期和[其他字段]的问题是它们经常变化。这使得该组织失败了。如果这是您的意图,您必须回询原始表以获取最大日期字段。我不确定[Other Field]是什么,但你必须考虑它们是否有不同的变化值。

SELECT dT.[User ID]
      ,dT.Points
      ,(SELECT MAX([Date Field]) 
          FROM #main M2 
         WHERE M2.[User ID] = dT.[User ID]) AS [Date Field]
  FROM (
         SELECT M.[User ID]
               ,SUM(M.Points) AS Points   
           FROM #main M
          WHERE [User ID] IN (SELECT [User ID] FROM #temp)
         GROUP BY M.[User ID]
       ) AS dT

创建输出:

User ID Points  Date Field
1       6       2016-10-31
3       6       2016-08-27

答案 2 :(得分:0)

我认为这应该有帮助

--======================= CREATE TEMP TABLE==============================
          CREATE TABLE #TEMP ([USER ID] INT,    
                            POINTS INT,
                            [DATE FIELD] DATE)
--======================= VALUES ON THE TABLE ===============================
          INSERT INTO #TEMP  VALUES ( 1 ,1,'10-31-2016')
          INSERT INTO #TEMP  VALUES  (3,1,'08-26-2016')
    --======================== CREATE MAIN TABLE ============================
          CREATE TABLE #MAIN ([USER ID] INT,
                            POINTS INT,
                            [DATE FIELD] DATE,
                            [OTHER FIELD] NVARCHAR(50))
     --======================= VALUES ON MAIN TABLE===================
        INSERT INTO #MAIN  VALUES ( 1,1,'10-31-2016','N/A')
        INSERT INTO #MAIN  VALUES ( 1,2,'10-25-2016','N/A')
        INSERT INTO #MAIN  VALUES ( 1,3,'09-18-2016','N/A')
        INSERT INTO #MAIN  VALUES ( 2,1,'08-17-2017','N/A')
        INSERT INTO #MAIN  VALUES ( 2,16,'07-11-2017','N/A')
        INSERT INTO #MAIN  VALUES ( 3,1,'08-27-2016','N/A')
        INSERT INTO #MAIN  VALUES ( 3,5,'05-14-2016','N/A')
     --=====GETTING SUM OF YOUR POINTS=====
        SELECT  T2.[USER ID],
                SUM(T1.[POINTS]) AS [TOTAL POINT],
                T2.[DATE FIELD],
                T1.[OTHER FIELD]
        FROM #MAIN AS T1
        RIGHT JOIN #TEMP AS T2
        ON T1.[USER ID] = T2.[USER ID]
        GROUP BY T2.[USER ID],
                 T2.[DATE FIELD],
                 T1.[OTHER FIELD]

        DROP TABLE #TEMP
        DROP TABLE #MAIN