簡體   English   中英

轉置SQL表的最簡潔方法

[英]Most Concise Way to Transpose SQL Table

我如何轉置此表,所以我有兩列,一列顯示付費用戶的比例,另一列顯示免費用戶的比例。 另外,在我的腳本中,有什么方法可以使代碼更簡潔,更像“ SQL”? 似乎還無法在sqlfiddle中使用select語句創建表,因為我收到一條錯誤消息,指出只能在架構屏幕中創建表。 無論如何,我可以將sql語句嵌入到新表中嗎?

我在sqlfiddle上創建了一個腳本,該腳本可為不同類型的用戶計算一些下載指標: http ://sqlfiddle.com/#!9/79bea4/1

SELECT df.Date,
       SUM(CASE WHEN ad.paying_customer = 'No'
                THEN df.downloads ELSE 0 END) /
       SUM(CASE WHEN ad.paying_customer = 'No' THEN 1 ELSE 0 END) AS `Average Downloads/Free User`,
       SUM(CASE WHEN ad.paying_customer = 'Yes'
                THEN df.downloads ELSE 0 END) /
       SUM(CASE WHEN ad.paying_customer = 'Yes' THEN 1 ELSE 0 END) AS `Average Downloads/Paid User`
FROM
(
    SELECT date,
           user_id,
           SUM(downloads) AS downloads
    FROM download_facts
    GROUP BY date,
             user_id
) df
INNER JOIN user_dimension ud
    ON df.user_id = ud.user_id
INNER JOIN account_dimension ad
    ON ud.account_id = ad.account_id
GROUP BY df.Date

演示在這里:

SQLFiddle

您可以通過將下載總和除以用戶數量來計算平均值。 然后count(distinct)可以獲取每個組中的用戶:

select df.date,
       (sum(df.downloads) /
        count(distinct case when ad.paying_customer = 'No' then df.user_id end)
       ) as avg_free,   
       (sum(df.downloads) /
        count(distinct case when ad.paying_customer = 'Yes' then df.user_id end)
       ) as avg_paying   
from download_facts df left join
     user_dimension ud
     on df.user_id = ud.user_id left join
     account_dimension ad
     on ad.account_id = ud.account_id
group by df.date;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM