2016-04-25 3 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

Тип столбца «продано» не имеет значения, 'count (*)' работает с любым типом;) –

+0

Конечно, продаваемые типы данных: 'продано '/' sold is true', если тип boolean, или 'sold = 'true'', если тип символа. Совсем другое. – 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 продано = 'true' THEN 1.00 ELSE 0.00 END)'? * (И ваша ссылка SQLFiddle, кажется, отсутствует ...) * – MatBailie

1

Вы можете сделать SUM() с CASE при условии, если автомобиль был продан или нет в GROUP BY:

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, набрали как символ и добавили '%'. – 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)) || '%' 
Смежные вопросы