2013-07-12 26 views
0

我試圖從每個[測量名稱]得到一個查詢,返回失敗百分比(從現在開始的失敗百分比)。現在,我在下面的查詢中可以針對特定SMP(示例)或通配符SMP返回特定值(作爲@MEASUREMENT輸入)的失敗百分比。SQL計數:如何得到一個表中的相同值的計數

但是,我遇到了麻煩,但是,編寫一個查詢將返回所有測量值的失敗百分比,其中失敗百分比對該值是唯一的。問題是如果@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 

回答

2

看來你需要做的就是使用GROUP BY子句和GROUP BY [測量名稱。 這會爲您提供小計,並且在編寫查詢時,您不需要知道[測量名稱]的列表。

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]放在select和GROUP BY中,因爲我不知道您的模型和數據關係。你可能想放棄它。

+0

帶有DISTINCT的GROUP BY? – Kermit

+0

通常我使用GROUP BY代替DISTINCT,而不是DISTINCT。 –

+0

這正是我一直在尋找的。謝謝! –