2016-04-25 76 views
1

假設我們銷售汽車,我們想知道每個品牌銷售多少輛汽車。SQL如何計算組的相對值?

數據:

car_id | brand | sold 
---------------------- 
1  | BMW | true 
2  | BMW | false 
3  | Mazda | true 
4  | Mazda | false 
5  | Mazda | true 

的結果,我們希望得到:

brand | sold 
------------ 
BMW | 50% 
Mazda | 66% 

如何做到這一點(在PostgreSQL的)?

+1

列賣出的數據類型?另外,標記使用的dbms。 (ANSI SQL'已售出'或'已售出')。 – jarlh

+0

'sold'列的類型應該不重要,'count(*)'適用於任何類型;) –

+0

當然,銷售的數據類型很重要:'sold如果是布爾類型,'/'售出是真的',或者如果字符類型是'sold''真'。有點不同。 – jarlh

回答

2

使用GROUP BY,然後用COUNT的組合除以SUM的真或假使用CASE聲明。

假設出售包含字符串不真實的真假。

SELECT brand, SUM(CASE WHEN sold = 'true' 
         THEN 1 
         ELSE 0 
        END)/COUNT(*) AS Sold 
FROM thedata 
GROUP BY brand 

輸出

brand Sold 
BMW  0.5 
Mazda 0.66 

,或者在SQL級別上完成的格式化。

SELECT brand, ROUND(SUM(CASE WHEN sold = 'true' 
          THEN 1 
          ELSE 0 
         END)/COUNT(*))*100)|| '%' AS Sold 
FROM thedata 
GROUP BY brand 

輸出

brand Sold 
BMW  50% 
Mazda 66% 
+0

或...'AVG(CASE WHEN sold ='true'THEN 1.00 ELSE 0.00 END)'? *(你的SQLFiddle鏈接似乎丟失了......)* – MatBailie

1

你可以,如果汽車再在GROUP BY出售或沒有條件做了SUM()CASE

Select brand, 
     Sum(Case When sold = 'true' Then 1.00 Else 0.00 End)/Count(*) As sold 
From carTable 
Group By brand 

隨着百分比爲VARCHAR

Select brand, 
     Convert(Varchar, 
      Sum(Case When sold = 'true' Then 1.00 Else 0.00 End)/Count(*) 
      * 100) + '%' As sold 
From carTable 
Group By brand 
+1

你忘了* 100,將其轉換爲char並添加'%'。 – jarlh

1

ANSI SQL回答:

select brand, count(case when sold then 1 end)*100/count(*) 
from cars 
group by brand 

如果你想50%,而不是僅僅50,做到:

cast(count(case when sold then 1 end)*100/count(*) as varchar(3)) || '%'