2016-12-28 390 views
0

我有三列,全部由1和0組成。對於這些列中的每一列,我如何計算在Oracle SQL中第一列有1和第二或第三列有1的人(一個人是一行/ ID)的百分比?計算Oracle SQL中列的百分比

例如:

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) 
+0

是您的人/ ID在此表中唯一的?在這個例子中,它看起來是的,但是你的「最終」段傾向於說明相反的情況,如果你需要一個「時間順序」,它會丟失某種時間戳。因此,澄清和編輯您的數據以反映現實。你的問題在這種狀態下不可避免。 –

+0

謝謝你讓我知道。這些人確實*不是*獨特的。我編輯了id,希望現在有點更清楚。 – Veraaa

+0

在你的例子中,結果應該是什麼?你可以發佈你需要得到的結果嗎? – Aleksej

回答

0

使用countsumcase expressions,基本的算術運算符一起+,/,*

  • COUNT(*)給人人在表
  • SUM(column)總計數給出1總和在給定列
  • 案例表達式可以實現更復雜的條件

的常見模式是X/COUNT(*) * 100其被用來計算給定的值(VAL /總* 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; 
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 
) 

我都有點過於複雜的事情,因爲你的數據仍然是我不清楚。子查詢可確保所有副本都清理和你只有每個人1或0 marketing_campaignsales


關於你的第二個問題:

最後,我想搞清楚人們進入 銷售時間的順序。他們是否首先從營銷活動轉到個人活動 ,然後再銷售,或者不管這些 渠道是否購買。

這是不可能在這種狀態下做的,因爲你沒有在你的桌子上,或者:

  • 將保持在該行被插入的順序唯一行標識符
  • 一個時間戳列,告訴何時行被插入。

沒有這個,從表中返回的行的順序將是不可預知的,或者如果您願意,純粹的隨機。