SQL - 通过除以另一个字段的频率按比例输出的字段

时间:2015-08-18 11:17:39

标签: mysql sql sql-server

我试图表现出一个比例'网站用户数据的字段,其中比例将衡量某个数据源对其转换的贡献程度(无论可能是什么,它都无关紧要)。

这是我希望用SQL实现的那种输出:

Month  | ID | Country | Data Source |Proportion
Jan-15 | 1  | UK      |   GA        |    0.5
Jan-15 | 1  | UK      |   Omniture  |    0.5
Jan-15 | 2  | France  |   GA        |     1
Jan-15 | 3  | Germany |   GA        |    0.25
Jan-15 | 3  | Germany |   Omniture  |    0.25
Jan-15 | 3  | Germany |   Email     |    0.25
Jan-15 | 3  | Germany |   Moz       |    0.25
Feb-15 | 1  | UK      |   GA        |    0.5
Feb-15 | 1  | UK      |   Omniture  |    0.5
Feb-15 | 2  | France  |   Omniture  |    0.5
Feb-15 | 2  | France  |   GA        |    0.5
Feb-15 | 3  | Germany |   Omniture  |    0.33
Feb-15 | 3  | Germany |   Email     |    0.33
Feb-15 | 3  | Germany |   Moz       |    0.33
Mar-15 | 1  | UK      |   Omniture  |    0.5
Mar-15 | 1  | UK      |   GA        |    0.5
Mar-15 | 2  | France  |   Omniture  |    0.5
Mar-15 | 2  | France  |   Email     |    0.5

这是我目前正在使用的SQL失败:

SELECT
    MONTH(registrationDate), country, DataSource, 1/COUNT(ID)
FROM
    data_table
WHERE
    registrationDate IS NOT NULL
GROUP BY
    MONTH(registrationDate), ID

这只是给出一个比例的实例。使用上面的示例,1月份ID为1的用户只有一条比例= 0.5的记录。

非常感谢在数据源之间正确共享显示此比例值的任何帮助!

1 个答案:

答案 0 :(得分:1)

您需要将结果与原始数据相结合。以下是使用JOIN的方法:

SELECT dt.*, ddt.value
FROM data_table dt JOIN
     (SELECT MONTH(registrationDate) as mon, ID, 
             1.0/COUNT(applicantId) as value
      FROM data_table
      WHERE registrationDate IS NOT NULL
      GROUP BY MONTH(registrationDate), ID
     ) ddt
     ON ddt.id = dt.id AND 
        ddt.mon = MONTH(dt.registrationDate);

您的问题包含IDApplicationIdRegistrationId。我不确定使用哪个正确的列。

编辑:

包括年份(在所有情况下都是一个好主意):

SELECT dt.*, ddt.value
FROM data_table dt JOIN
     (SELECT YEAR(registrationDate) as yyyy, MONTH(registrationDate) as mon, ID, 
             1.0/COUNT(applicantId) as value
      FROM data_table
      WHERE registrationDate IS NOT NULL
      GROUP BY YEAR(registrationDate), MONTH(registrationDate), ID
     ) ddt
     ON ddt.id = dt.id AND 
        ddt.mon = MONTH(dt.registrationDate) AND
        ddt.yyyy = YEAR(dt.registrationDate);