SQL计数:如何获取表中相同值的计数
我试图得到一个查询,返回每个[度量名称]的失败百分比(“失败%”)。现在,我在下面的查询中可以返回特定SMP(示例)或通配符SMP的特定值(输入为@MEASUREMENT)的失败百分比 但是,我在编写一个查询时遇到了问题,该查询将返回所有度量值的fail%,其中fail%对于该值是唯一的。问题是,如果@measurement是一个通配符,我只能让COUNT函数来计算度量表中的所有失败,因此每个失败都有相同的失败百分比 除了使用将度量名称作为主键的表链接到我的其他表之外,还有其他方法可以解决此问题吗?(我认为这在我的情况下不是最佳的,因为会有许多不同的度量名称) 我的数据库表的结构如下(仅包括相关表): 表:测量 列:状态(通过/失败)、SMP ID、名称SQL计数:如何获取表中相同值的计数,sql,Sql,我试图得到一个查询,返回每个[度量名称]的失败百分比(“失败%”)。现在,我在下面的查询中可以返回特定SMP(示例)或通配符SMP的特定值(输入为@MEASUREMENT)的失败百分比 但是,我在编写一个查询时遇到了问题,该查询将返回所有度量值的fail%,其中fail%对于该值是唯一的。问题是,如果@measurement是一个通配符,我只能让COUNT函数来计算度量表中的所有失败,因此每个失败都有相同的失败百分比 除了使用将度量名称作为主键的表链接到我的其他表之外,还有其他方法可以解决此问题
DECLARE @SMP varchar(50)
DECLARE @MEASUREMENT varchar(50)
SET @SMP = ''
SET @MEASUREMENT = 'Value 1'
IF(@SMP = '')
SET @SMP = '%'
IF(@SMP = '%')
SELECT DISTINCT
[Measurements].[Measurement Name],
((CONVERT(float, (SELECT COUNT(*) FROM dbo.[Measurements]
WHERE [Status] = 'Fail' AND [Measurement Name] LIKE @MEASUREMENT AND [SMP ID] LIKE @SMP)) /
(CONVERT(float, (SELECT COUNT(*) FROM dbo.[Measurements]
WHERE [Measurement Name] = @MEASUREMENT AND [SMP ID] LIKE @SMP)))
)) As [Fail %]
FROM dbo.[Measurements]
WHERE [Measurements].[SMP ID] LIKE @SMP
AND [Measurements].[Measurement Name] LIKE @MEASUREMENT
ELSE
SELECT DISTINCT [Measurements].[SMP ID],
[Measurements].[Measurement Name],
((CONVERT(float, (SELECT COUNT(*) FROM dbo.[Measurements]
WHERE [Status] = 'Fail' AND [Measurement Name] LIKE @MEASUREMENT AND [SMP ID] LIKE @SMP)) /
(CONVERT(float, (SELECT COUNT(*) FROM dbo.[Measurements]
WHERE [Measurement Name] = @MEASUREMENT AND [SMP ID] = @SMP)))
)) As [Fail %]
FROM dbo.[Measurements]
WHERE [Measurements].[SMP ID] LIKE @SMP
AND [Measurements].[Measurement Name] LIKE @MEASUREMENT
似乎您需要做的是使用GROUPBY子句,并使用GROUPBY[Measurement Name]。 这将为您提供小计,在编写查询时,您不需要知道[度量名称]列表是什么
select
[Measurement Name]
, [SMP ID]
, [Fail Count] = SUM([Fail])
, [Not Fail Count] = SUM([Not Fail])
, [Fail %] = 100 * SUM([Fail]) / SUM(1)
from [Measurements]
cross apply (SELECT [Fail] = case when [Status] = 'Fail' then 1 else 0 end) [X_Fail]
cross apply (SELECT [Not Fail] = case when [Status] <> 'Fail' then 1 else 0 end) [X_Not Fail]
group by [Measurement Name], [SMP ID]
选择
[测量名称]
,[SMP ID]
,[Fail Count]=总和([Fail])
,[Not Fail Count]=总和([Not Fail])
,[Fail%]=100*SUM([Fail])/SUM(1)
从[测量]
交叉应用(选择[Fail]=当[Status]=“Fail”时的情况,然后选择1或0结束)[X_Fail]
交叉应用(选择[Not Fail]=当[Status]'Fail'然后1 else 0 end时的情况)[X\U Not Fail]
分组依据[测量名称],[SMP ID]
我不确定是否将[SMP ID]放入select和GROUP BY,因为我不知道您的模型和数据关系。您可能想删除它。
分组依据
与不同
?通常我使用分组依据代替不同,而不是除了不同之外。这正是我想要的。非常感谢。