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 - Fatal编程技术网

SQL计数:如何获取表中相同值的计数

SQL计数:如何获取表中相同值的计数,sql,Sql,我试图得到一个查询,返回每个[度量名称]的失败百分比(“失败%”)。现在,我在下面的查询中可以返回特定SMP(示例)或通配符SMP的特定值(输入为@MEASUREMENT)的失败百分比 但是,我在编写一个查询时遇到了问题,该查询将返回所有度量值的fail%,其中fail%对于该值是唯一的。问题是,如果@measurement是一个通配符,我只能让COUNT函数来计算度量表中的所有失败,因此每个失败都有相同的失败百分比 除了使用将度量名称作为主键的表链接到我的其他表之外,还有其他方法可以解决此问题

我试图得到一个查询,返回每个[度量名称]的失败百分比(“失败%”)。现在,我在下面的查询中可以返回特定SMP(示例)或通配符SMP的特定值(输入为@MEASUREMENT)的失败百分比

但是,我在编写一个查询时遇到了问题,该查询将返回所有度量值的fail%,其中fail%对于该值是唯一的。问题是,如果@measurement是一个通配符,我只能让COUNT函数来计算度量表中的所有失败,因此每个失败都有相同的失败百分比

除了使用将度量名称作为主键的表链接到我的其他表之外,还有其他方法可以解决此问题吗?(我认为这在我的情况下不是最佳的,因为会有许多不同的度量名称)

我的数据库表的结构如下(仅包括相关表):

表:测量

列:状态(通过/失败)、SMP ID、名称

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,因为我不知道您的模型和数据关系。您可能想删除它。

分组依据
不同
?通常我使用分组依据代替不同,而不是除了不同之外。这正是我想要的。非常感谢。