Sql 如何对一组结果执行计数
我试图对一组值执行计数,但计数会带来额外的值 以下是一些背景资料。以下T-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
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值的名称,另一列显示它在指定的项目和基线中出现的次数。