我有三列,全部由1和0组成。对于这些列中的每一列,我如何计算第一列中有1的人的百分比(一个人为一个行/ID),在Oracle SQL中的第二或第三列中有1个?
例如:
id marketing_campaign personal_campaign sales
1 1 0 0
2 1 1 0
1 0 1 1
4 0 0 1
因此,在这种情况下,在所有受到Marketing_Campaign的人中,也有50%的人受到个人运动的约束,但销售中有零百分比(没人买任何东西)。
最终,我想找出人们到达销售时刻的订单。他们是否首先从营销活动到个人活动,然后再进行销售,还是无论这些渠道如何购买。
这是一个虚构的例子,所以我意识到在此示例中,还有许多其他方法可以做到这一点,但是我希望任何人都可以提供帮助!
我正在寻找的结果是这样:
percentage marketing_campaign/ personal campaign = 50 %
percentage marketing_campaign/sales = 0%
etc (for all the three column combinations)
使用count
,sum
和case expressions
,以及基本的算术运算符 ,/,*
-
COUNT(*)
总计表中的人数 -
SUM(column)
在给定的列中给出1的总和 - 案例表达使实施更复杂的条件有可能
常见模式是X / COUNT(*) * 100
,用于计算给定值的百分比(Val/Total * 100%)
一个例子:
SELECT
-- percentage of people that have 1 in marketing_campaign column
SUM( marketing_campaign ) / COUNT(*) * 100 As marketing_campaign_percent,
-- percentage of people that have 1 in sales column
SUM( sales ) / COUNT(*) * 100 As sales_percent,
-- complex condition:
-- percentage of people (one person is one row/ id) who have a 1
-- in the first column and a 1 in the second or third column
COUNT(
CASE WHEN marketing_campaign = 1
AND ( personal_campaign = 1 OR sales = 1 )
THEN 1 END
) / COUNT(*) * 100 As complex_condition_percent
FROM table;
您可以得到这样的百分比:
SELECT COUNT(*),
ROUND(100*(SUM(personal_campaign) / sum(count(*)) over ()),2) perc_personal_campaign,
ROUND(100*(SUM(sales) / sum(count(*)) over ()),2) perc_sales
FROM (
SELECT ID,
CASE
WHEN SUM(personal_campaign) > 0 THEN 1
ELSE 0
end AS personal_campaign,
CASE
WHEN SUM(sales) > 0 THEN 1
ELSE 0
end AS sales
FROM the_table
WHERE ID IN
(SELECT ID FROM the_table WHERE marketing_campaign = 1)
GROUP BY ID
)
我有点过分复杂化,因为您的数据仍然不清楚。该子查询确保清理所有重复项,并且您只为每个人提供marketing_campaign
中的1或0,并且sales
关于您的第二个问题:
最终,我想找出人们到达的顺序 销售时刻。他们是否首先从营销活动转向个人 竞选活动,然后进行销售,或者无论如何都购买 频道。
这在这种状态下是不可能的,因为您的桌子上没有:
- 一个唯一的行标识符,将保持行插入行的顺序
- 一个时间戳列,该列会插入何时插入行。
没有此,从表中返回的行订单将是不可预测的,或者,如果您愿意,纯随机。