寻找所有行的总和并计算重复项的SQL查询

5
如果数据格式如下:
SID  TID  Tdatetime        QID   QTotal  
----------------------------------------
100  1    01/12/97 9:00AM  66    110   
100  1    01/12/97 9:00AM  66    110  
100  1    01/12/97 10:00AM 67    110  
100  2    01/19/97 9:00AM  66    .  
100  2    01/19/97 9:00AM  66    110  
100  2    01/19/97 10:00AM 66    110  
100  3    01/26/97 9:00AM  68    120  
100  3    01/26/97 9:00AM  68    120  
110  1    02/03/97 10:00AM 68    110  
110  3    02/12/97 9:00AM  64    115  
110  3    02/12/97 9:00AM  64    115  
120  1    04/05/97 9:00AM  66    105  
120  1    04/05/97 10:00AM 66    105  

我希望能够编写一个查询来对所有行的QTotal列求和,并查找Tdatetime列中重复行的数量。

The output would look like:

  Year   Total  Count<br>
     97 | 1340 | 4
The third column in the result does not include the count of distinct rows in the table. And the output is grouped by the year in the TDateTime column.


我不确定您需要哪些数据库信息。 - ARK
他在问什么是DBMS。SQL Server、Oracle、MySql等。 - Abe Miessler
6个回答

1
这将起作用,如果您真的想按tDateTime列分组:
SELECT DISTINCT tDateTime, SUM(QTotal), Count(distinct tDateTime)
FROM Table
GROUP BY tDateTime
HAVING  Count(distinct tDateTime) > 1

但是你的结果看起来像是想按tDateTime列中的年份进行分组。这是正确的吗?

如果是这样,请尝试这个:

SELECT DISTINCT YEAR (tDateTime), SUM(QTotal), Count(distinct tDateTime)
FROM Table
GROUP BY YEAR (tDateTime)
HAVING  Count(distinct tDateTime) > 1

是的,我希望按年份对TDateTime列进行分组。 - ARK
这会包括没有重复行的行吗?查询结果应该只显示重复计数,不包括不同的行。 - ARK
嗯,好的,我想我需要进行一些重构。我添加了一个HAVING语句,但我觉得还缺少一些东西。请稍等... - Abe Miessler
好的,我对你所期望结果中的计数值为4不太清楚。你说要计算重复的tDateTime,但是这里有5个重复日期?你是不是想输入5? - Abe Miessler

1

以下查询可能有所帮助:

SELECT 
    'YEAR ' + CAST(sub.theYear AS VARCHAR(4)), 
    COUNT(sub.C), 
    (SELECT SUM(QTotal) FROM MyTable WHERE YEAR(Tdatetime) = sub.theYear) AS total
FROM 
   (SELECT 
        YEAR(Tdatetime) AS theYear, 
        COUNT(Tdatetime) AS C 
    FROM MyTable 
    GROUP BY Tdatetime, YEAR(Tdatetime)
    HAVING COUNT(Tdatetime) >= 2) AS sub

此查询似乎无法解决上述情况。 - ARK
我知道这是一个老问题,但是对于其他人来说: HAVING COUNT(Tdatetime)>2 可能应该是 > 1 或者 >= 2 否则它将不能找到任何统计为2的结果。 - laurencemadill

0
你必须从这个表中进行SELECT操作,按照QTotal进行分组,并使用COUNT(从这个表中的子查询WHERE QTotal相同)。如果我有时间,我会为你编写SQL语句,但这需要一些时间。

0

这是我第一次在stackoverflow上提问。看起来我已经丢失了我的原始ID信息。我不得不注册才能登录并添加评论到我发布的问题。

回答OMG Ponies的问题,这是一个SQL Server 2008数据库。 @Abe Miessler,SID为120的行没有重复项。SID为120的第一行在datetime列中显示9:00AM,第二行显示10:00AM。

@Zafer,你的查询是被接受的答案。我进行了一些微小的调整使其正常工作。谢谢。 感谢Abe Miessler和其他人的帮助。


0

类似这样:

select Year(Tdatetime)  ,sum(QTotal), count(1) from table group by year(Tdatetime )

或完整日期

select Tdatetime  ,sum(QTotal), count(1) from table group by year(Tdatetime) 

或者你的丑陋语法(:)

select 'Year ' + cast(Year(tdatetime) as varchar(4)) 
     + '|' + cast(sum(QTotal) as varchar(31)) 
     + '|' + cast(count(1) as varchar(31)) 
 from table group by year(Tdatetime )

还是只想要年份?需要对所有列求和吗?还是只按年份统计?


按TDateTime列分组,计算Qtotal列的总和。计算TDateTime列中重复项的数量。 - ARK

0
SELECT
 YEar + year(Tdatetime),
 SUM ( QTotal ),
 (SELECT COUNT(*) FROM ( 
 SELECT Tdatetime FROM tDateTime GROUP BY Tdatetime        
 HAVING COUNT(QID) > 1) C
FROM
 Tdatetime t

GROUP BY 
 YEar + year(Tdatetime)

我觉得您已经按照所述回答了问题,但我认为实际问题是错误的。如此显示,返回的数据是非规范化的。它为每一行显示相同的COUNT值,该值表示整个人口而不是组的年份。我认为内部子查询需要更改为相关子查询,过滤“year(Tdatetime)”。 - Chris Wuestefeld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接