繁体   English   中英

使用SQL计算转换

[英]Calculate conversion using SQL

假设有一个包含两列的activities表:字符串actioncreated_at时间戳。 并且操作列visitsignup只有两个可能的值。

我想查看每天每次访问的注册百分比。 喜欢:

Date       |  Conversion
--------------------------
2013-01-01 |  30%
2013-01-02 |  27%
2013-01-03 |  15%
2013-01-04 |  22%

一个SQL查询可能吗?

对于SQL Server,这应该可以工作:

SELECT coalesce(v.y, s.y) y, coalesce(v.m, s.m) m, coalesce(v.d, s.d) d, 
    100.0 * isnull(s.num, 0) / (isnull(s.num, 0) + isnull(v.num, 0)) conversion  
FROM
(
    SELECT datepart(YEAR, [date]) y, datepart(m, [date]) m,datepart(d, [date]) d, 
        count(action) num
    FROM actions
    WHERE action = 'visit'
    GROUP BY datepart(YEAR, [date]), datepart(m, [date]), datepart(d, [date])
) v
FULL OUTER JOIN
(
    SELECT datepart(YEAR, [date]) y, datepart(m, [date]) m,datepart(d, [date]) d, 
        count(action) num
    FROM actions
    WHERE action = 'signup'
    GROUP BY datepart(YEAR, [date]), datepart(m, [date]), datepart(d, [date])
) s
ON v.y = s.y AND v.m = s.m AND v.d = s.d

我将字符串串联,舍入和一般鲁棒性作为练习留给您。

如果这是SQL Server 2005+,则可以尝试以下方法:

SELECT
  Date,
  Conversion = signup * 100.0 / (signup + visit)
FROM (
  SELECT
    Date = DATEADD(DAY, DATEDIFF(DAY, 0, created_at), 0),
    action
  FROM activities
) AS a
PIVOT (
  COUNT(action) FOR action IN (visit, signup)
) AS p
;

Date表达式从时间部分剥离了created_at时间戳。 在SQL Server 2008和更高版本中,可以用更简洁,更有效的强制转换为date类型的操作来代替它:

Date = CAST(created_at AS date)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM