计算Oracle SQL

时间:2016-12-28 08:24:27

标签: sql oracle

我有三列,全部由1和0组成。对于这些列中的每一列,如何计算在oracle SQL中第一列中的1和第二列或第三列中的1的人的百分比(一个人是一行/ id)?

例如:

id    marketing_campaign    personal_campaign     sales
 1       1                    0                    0 
 2       1                    1                    0
 1       0                    1                    1
 4       0                    0                    1 

因此,在这种情况下,在所有受到营销活动的人中,50%的人也接受了个人活动,但销售额中只有0%(没有人购买任何东西)。

最终,我想找出人们进入销售时刻的订单。他们首先从营销活动转到个人活动再到销售,或者无论这些渠道如何,他们都会购买。

这是一个虚构的例子,所以我意识到在这个例子中有很多其他方法可以做到这一点,但我希望任何人都可以提供帮助!

我正在寻找的结果是这样的:

percentage marketing_campaign/ personal campaign = 50 %
percentage marketing_campaign/sales = 0%
etc (for all the three column combinations)

2 个答案:

答案 0 :(得分:0)

你可以得到这样的百分比:

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_campaignsales中的1或0

关于你的第二个问题:

  

最终,我想找出人们到达的顺序   销售时刻。他们首先从营销活动转向个人活动   广告系列然后销售,或者他们无论如何都会购买   信道。

在这种情况下,这是不可能的,因为你的表中没有:

  • 一个唯一的行标识符,用于保持插入行的顺序
  • 一个时间戳列,用于指示何时插入行。

如果没有这个,从表中返回的行的顺序将是不可预测的,或者如果您愿意,则是纯随机的。

答案 1 :(得分:0)

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