计算Oracle SQL中的列百分比



我有三列,全部由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)

使用countsumcase 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


关于您的第二个问题:

最终,我想找出人们到达的顺序 销售时刻。他们是否首先从营销活动转向个人 竞选活动,然后进行销售,或者无论如何都购买 频道。

这在这种状态下是不可能的,因为您的桌子上没有:

  • 一个唯一的行标识符,将保持行插入行的顺序
  • 一个时间戳列,该列会插入何时插入行。

没有此,从表中返回的行订单将是不可预测的,或者,如果您愿意,纯随机。

最新更新