Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何对一组结果执行计数_Sql_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql 如何对一组结果执行计数

Sql 如何对一组结果执行计数,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我试图对一组值执行计数,但计数会带来额外的值 以下是一些背景资料。以下T-SQL查询返回我需要的数据: SELECT DISTINCT [REQ_INFO].UDAValue as 'UDA value', REQ_INFO.ProjectID, REQ_INFO.BaselineID, Req_ID FROM [REQ_INFO] INNER JOIN [Project_INFO] ON [REQ_INFO].[ProjectID]=[Project_INFO].[ProjectID] IN

我试图对一组值执行计数,但计数会带来额外的值

以下是一些背景资料。以下T-SQL查询返回我需要的数据:

SELECT DISTINCT [REQ_INFO].UDAValue as 'UDA value', REQ_INFO.ProjectID, 
REQ_INFO.BaselineID, Req_ID
FROM [REQ_INFO]
INNER JOIN [Project_INFO] ON [REQ_INFO].[ProjectID]=[Project_INFO].[ProjectID]
INNER JOIN [Baseline_INFO]ON [REQ_INFO].[BaselineID]=[Baseline_INFO].[BaselineID]
WHERE [Project_INFO].[Name] = 'Address Book'
AND [Baseline_INFO].Name = 'Current Baseline'
AND [UDAName] = 'Requirement Priority'
ORDER BY REQ_INFO.Req_ID
这将返回以下数据:

我还需要计算每个值在UDA值列中出现的次数。总金额应为11,如上所示。但是,我尝试了以下代码,但它正在计算额外的行数:

SELECT [REQ_INFO].UDAValue as 'UDA value',COUNT (*) as 'UDA Num'
FROM [REQ_INFO]
INNER JOIN [Project_INFO] ON [REQ_INFO].[ProjectID]=[Project_INFO].[ProjectID] 
INNER JOIN [Baseline_INFO]ON [REQ_INFO].[BaselineID]=[Baseline_INFO].[BaselineID]
WHERE [Project_INFO].[Name] = 'Address Book' 
AND [Baseline_INFO].Name = 'Current Baseline'
AND [UDAName] = 'Requirement Priority'
GROUP BY REQ_INFO.UDAValue


有人对我做错了什么有什么建议吗?

在我看来,很可能是第一个查询中的
distinct
语句造成了差异

如果您要查找的是[REQ_INFO].UDAValue的实际发生次数。然后,您应该从第一个查询中删除
distinct
子句,以查看第二个查询的实际计数

或者,您可以看到第一个查询的分组值的总计数,如下所示,但与第一个和第二个查询不同

SELECT [REQ_INFO].UDAValue as 'UDA value',COUNT (*) as 'UDA Num' 
FROM [REQ_INFO] 
INNER JOIN [Project_INFO] ON [REQ_INFO].[ProjectID]=[Project_INFO].[ProjectID]  
INNER JOIN [Baseline_INFO]ON [REQ_INFO].[BaselineID]=[Baseline_INFO].[BaselineID] 
WHERE [Project_INFO].[Name] = 'Address Book'  
AND [Baseline_INFO].Name = 'Current Baseline' 
AND [UDAName] = 'Requirement Priority' 
GROUP BY REQ_INFO.UDAValue, REQ_INFO.ProjectID, REQ_INFO.BaselineID, Req_ID

从你的问题很难判断这是否是你想要的。如果您确实希望在第一个查询出现时对其值进行计数(影响4列和所有列的distinct语句)。然后您可能会使用子查询来处理它。

在我看来,最有可能是第一个查询中的
distinct
语句造成了差异

如果您要查找的是[REQ_INFO].UDAValue的实际发生次数。然后,您应该从第一个查询中删除
distinct
子句,以查看第二个查询的实际计数

或者,您可以看到第一个查询的分组值的总计数,如下所示,但与第一个和第二个查询不同

SELECT [REQ_INFO].UDAValue as 'UDA value',COUNT (*) as 'UDA Num' 
FROM [REQ_INFO] 
INNER JOIN [Project_INFO] ON [REQ_INFO].[ProjectID]=[Project_INFO].[ProjectID]  
INNER JOIN [Baseline_INFO]ON [REQ_INFO].[BaselineID]=[Baseline_INFO].[BaselineID] 
WHERE [Project_INFO].[Name] = 'Address Book'  
AND [Baseline_INFO].Name = 'Current Baseline' 
AND [UDAName] = 'Requirement Priority' 
GROUP BY REQ_INFO.UDAValue, REQ_INFO.ProjectID, REQ_INFO.BaselineID, Req_ID

从你的问题很难判断这是否是你想要的。如果您确实希望在第一个查询出现时对其值进行计数(影响4列和所有列的distinct语句)。然后您可能会使用一个子查询来处理它。

更改您的计数以包含一个不同的;大概是这样的:

SELECT [REQ_INFO].UDAValue as 'UDA value',COUNT (DISTINCT REQ_INFO.Req_ID) as 'UDA Num'
... rest of your query

更改您的计数以包含一个不同的值;大概是这样的:

SELECT [REQ_INFO].UDAValue as 'UDA value',COUNT (DISTINCT REQ_INFO.Req_ID) as 'UDA Num'
... rest of your query

我可以通过创建一个临时表来解决这个问题,以便进行计数。这是我使用的SQL语句:

DECLARE @UDAcount TABLE (UDAValue nvarchar(max), ProjectID int, 
BaselineID int, Req_ID int, Version nvarchar(128))

INSERT INTO @UDAcount (UDAValue, ProjectID, BaselineID, Req_ID, Version)
SELECT DISTINCT [REQ_INFO].UDAValue as 'UDA value', REQ_INFO.ProjectID, 
REQ_INFO.BaselineID, Req_ID, REQ_INFO.Version
FROM [REQ_INFO]
INNER JOIN [Project_INFO] ON [REQ_INFO].[ProjectID]=[Project_INFO].[ProjectID]
INNER JOIN [Baseline_INFO]ON [REQ_INFO].[BaselineID]=[Baseline_INFO].[BaselineID]
WHERE [Project_INFO].[Name] = 'Address Book'
AND [Baseline_INFO].Name = 'Current Baseline'
AND [UDAName] = 'Requirement Priority'
ORDER BY REQ_INFO.Req_ID

SELECT UDAValue as 'UDA value',COUNT (*) as 'UDA Num'
FROM @UDAcount
GROUP BY UDAValue

它可能不是最优雅的解决方案,但它确实返回了期望的结果。如果您对如何改进这一点有任何建议,我很高兴听到。

我通过创建一个临时表来解决这个问题,让我可以执行计数。这是我使用的SQL语句:

DECLARE @UDAcount TABLE (UDAValue nvarchar(max), ProjectID int, 
BaselineID int, Req_ID int, Version nvarchar(128))

INSERT INTO @UDAcount (UDAValue, ProjectID, BaselineID, Req_ID, Version)
SELECT DISTINCT [REQ_INFO].UDAValue as 'UDA value', REQ_INFO.ProjectID, 
REQ_INFO.BaselineID, Req_ID, REQ_INFO.Version
FROM [REQ_INFO]
INNER JOIN [Project_INFO] ON [REQ_INFO].[ProjectID]=[Project_INFO].[ProjectID]
INNER JOIN [Baseline_INFO]ON [REQ_INFO].[BaselineID]=[Baseline_INFO].[BaselineID]
WHERE [Project_INFO].[Name] = 'Address Book'
AND [Baseline_INFO].Name = 'Current Baseline'
AND [UDAName] = 'Requirement Priority'
ORDER BY REQ_INFO.Req_ID

SELECT UDAValue as 'UDA value',COUNT (*) as 'UDA Num'
FROM @UDAcount
GROUP BY UDAValue

它可能不是最优雅的解决方案,但它确实返回了期望的结果。如果您对此有任何改进建议,我很高兴听到。

这不是每个值都返回1吗(因为它是不同的)。适用于我尝试的测试示例,与您的回答相比,它没有太多。谢谢您的建议,但将distinct关键字放在您建议的位置会将每个值作为一个返回。很抱歉,我刚刚意识到我的示例计算了UDAValue,实际上它应该是REQU_ID。修改示例以反映这一点,不就是每个值只返回1(因为它是不同的)。适用于我尝试过的测试示例,与您的回答相比,没有太多。感谢您的建议,但将distinct关键字放在您建议的位置会将每个值作为一个返回。抱歉,我刚刚意识到我的示例计算了UDAValue,实际上它应该是REQU_ID。修改示例以反映此感谢您的反馈。我需要包含distinct语句,因为在我运行查询的表中,每个UDA值都有多个版本。我要做的是返回一个查询,该查询有两列,一列包含UDA值的名称,另一列显示它在指定的项目和基线中出现的次数。感谢您的反馈。我需要包含distinct语句,因为在我运行查询的表中,每个UDA值都有多个版本。我要做的是返回一个查询,该查询有两列,一列包含UDA值的名称,另一列显示它在指定的项目和基线中出现的次数。