返回一列的总行数

Returning total rows for one column

我在下面查询 return 指定 SQL 实例的性能数据。我遇到的问题是相同的文本数据针对不同的时间范围 returned。我正在寻找一种方法来总结相同行的文本数据和 return 总计 cpu、持续时间、读取、写入。

感谢您的帮助。

SELECT TOP 40 HostName, DatabaseName, ApplicationName,
       LoginName, CPU, TextData,
       Reads, Writes, Duration, StartTime, EndTime
FROM dbo.PerformanceTable 
WHERE  Duration > 10000

你只是想要聚合吗?

SELECT TextData,
       SUM(Reads), SUM(Writes), SUM(Duration)
FROM dbo.PerformanceTable 
WHERE Duration > 10000
GROUP BY TextData;

没有示例数据,很难提出解决方案。如果我理解正确的话,你想要每个主机名、数据库名、应用程序名、TextData 的总 cpu、持续时间、读取、写入,而不管它们的开始时间或结束时间。

SELECT HostName, DatabaseName, ApplicationName,TextData,
       sum(CPU), sum(Reads), sum(Writes), sum(Duration)
FROM dbo.PerformanceTable 
group by HostName, DatabaseName, ApplicationName,TextData
WHERE  Duration > 10000
order by HostName, DatabaseName, ApplicationName,TextData

根据您添加的屏幕截图,我修改了我的答案:

SELECT DatabaseName, TextData,
       sum(CPU) total_CPU , sum(Reads) total_Reads, sum(Writes) total_Writes , sum(Duration) total_Duration
FROM dbo.PerformanceTable 
group by DatabaseName, TextData
WHERE  Duration > 10000
order by DatabaseName, TextData

我已经用示例数据进行了测试,两种方式都给出了相同的答案。看一看。使用的聚合

CREATE TABLE PerformanceTable
  (
  TextData VARCHAR(MAX)
 , DatabaseName VARCHAR(100)
 ,CPU BIGINT
 ,READS BIGINT
 ,WRITES BIGINT
, Duration Bigint
 )

 INSERT INTO PerformanceTable  (TextData,DatabaseName,CPU, READS,WRITES,Duration) VALUES ('text', 'master', 45632589,2589633,15106,1457889)
 ,('text', 'master', 45678999,4666767,1001,10002)
 ,('text1', 'DatabSeName', 45678999,6778888,45689,10256)
 ,('text1', 'DatabSeName', 546789,6778888,56378,14578)
 ,('text2', 'MsDb', 546789,6778888,457896,478999)

第一种方式 - 所有其他版主都提供了,这应该可以正常工作。

 SELECT 
  TextData
 ,SUM(CPU) AS cpu_sum
 ,SUM(READS) AS Reads_sum
 ,SUM(WRITES) AS writes_sum
 ,SUM(Duration) AS duration_sum
FROM PerformanceTable
WHERE Duration >1000
GROUP BY TextData

另一种方式

SELECT 
*
FROM 
(
 SELECT 
   ROW_NUMBER() OVER( PARTITION BY TextData ORDER BY TextData ) AS row_id
  ,TextData
  ,SUM(CPU) AS cpu_sum
  ,SUM(READS) AS Reads_sum
  ,SUM(WRITES) AS writes_sum
  ,SUM(Duration) AS duration_sum
FROM PerformanceTable
GROUP BY TextData
) AS A WHERE 
A.row_id = 1
AND  A.duration_sum >1000