2015-12-02 165 views
0

即時通訊有點新的sql服務器,所以希望這不是太複雜。如果我有一組數據的表中顯示不同的記錄已經完成或不...SQL Server完成百分比類別

表1

ID CATEGORY COMPLETE 
1  reports  yes 
2  reports  no 
3  processes no 
4  processes yes 
5  reports  no 
6  events  yes 

...這將是創建一個新的領域的最佳途徑那會顯示每個類別的完成百分比?

表2

ID CATEGORY PERCENTAGE 
1  events  100% 
2  processes 50% 
3  reports  33% 

任何幫助,將不勝感激,謝謝。

回答

3

group by類別列和使用條件和在分子中只得到complete = 'yes'個案。

select category, 
100 * 1.0 * sum(case when complete = 'yes' then 1 else 0 end)/count(*) as pct 
from tablename 
group by category 
+2

1/2 = 0乘以1.0。或者使用'sum(case when complete ='yes'then 1.0 else 0.0 end)' – lad2025

+0

我會說你總是會從你的查詢中得到0或100,因爲你需要轉換成十進制。 –

+1

就在我剛要發佈更改..謝謝@ lad2025 –

2

您可以使用窗口功能和PARTITION BY Category

SELECT DISTINCT Category, 
[percentage] = ROUND(100 * SUM(CASE complete WHEN 'yes' THEN 1.0 ELSE 0.0 END) 
          OVER (PARTITION BY Category)/ 
          COUNT(*) OVER (PARTITION BY Category),0) 
FROM #tab; 

LiveDemo

隨着插入到第二個表:

SELECT DISTINCT 
    [id] = IDENTITY(INT, 1,1) 
,category 
,[percentage] = ROUND(100 * SUM(CASE complete WHEN 'yes' THEN 1.0 ELSE 0.0 END) 
          OVER (PARTITION BY CATEGORY)/ 
          COUNT(*) OVER (PARTITION BY Category),0) 
INTO #table2 
FROM #tab 
ORDER BY [percentage] DESC; 

SELECT * 
FROM #table2; 

LiveDemo2

1

我認爲最簡單的方法是使用avg()

select category, 
     avg(case when complete = 'yes' then 100.0 else 0 end) as pct 
from tablename 
group by category; 

如果你想這是一個百分比數字,你需要多一點的字符串操作:

select category, 
     str(avg(case when complete = 'yes' then 100.0 else 0 end)) + '%' as pct 
from tablename 
group by category; 

但是,我會建議保留值作爲數字。