MYSQL sum() for distinct rows

前端 未结 8 1790
太阳男子
太阳男子 2020-11-28 04:43

I\'m looking for help using sum() in my SQL query:

SELECT links.id, 
       count(DISTINCT stats.id) as clicks, 
       count(DISTINCT conversions.id) as con         


        
相关标签:
8条回答
  • 2020-11-28 04:49

    This will do the trick, just divide the sum with the count of conversation id which are duplicate.

    SELECT a.id,
           a.clicks,
           SUM(a.conversion_value/a.conversions) AS conversion_value,
           a.conversions
    FROM (SELECT links.id, 
           COUNT(DISTINCT stats.id) AS clicks, 
           COUNT(conversions.id) AS conversions, 
           SUM(conversions.value) AS conversion_value 
          FROM links 
          LEFT OUTER JOIN stats ON links.id = stats.parent_id 
          LEFT OUTER JOIN conversions ON links.id = conversions.link_id 
          GROUP BY conversions.id,links.id
          ORDER BY links.created DESC) AS a
    GROUP BY a.id
    
    0 讨论(0)
  • 2020-11-28 04:49
    Select sum(x.value) as conversion_value,count(x.clicks),count(x.conversions)
    FROM
    (SELECT links.id, 
           count(DISTINCT stats.id) as clicks, 
           count(DISTINCT conversions.id) as conversions,
           conversions.value,       
    FROM links 
    LEFT OUTER JOIN stats ON links.id = stats.parent_id 
    LEFT OUTER JOIN conversions ON links.id = conversions.link_id 
    GROUP BY conversions.id) x
    GROUP BY x.id 
    ORDER BY x.created desc;
    

    I believe this will give you the answer that you are looking for.

    0 讨论(0)
  • 2020-11-28 04:53

    I use a subquery to do this. It eliminates the problems with grouping. So the query would be something like:

    SELECT COUNT(DISTINCT conversions.id)
    ...
         (SELECT SUM(conversions.value) FROM ....) AS Vals
    
    0 讨论(0)
  • 2020-11-28 05:00

    Use the following query:

    SELECT links.id
      , (
        SELECT COUNT(*)
        FROM stats
        WHERE links.id = stats.parent_id
      ) AS clicks
      , conversions.conversions
      , conversions.conversion_value
    FROM links
    LEFT JOIN (
      SELECT link_id
        , COUNT(id) AS conversions
        , SUM(conversions.value) AS conversion_value
      FROM conversions
      GROUP BY link_id
    ) AS conversions ON links.id = conversions.link_id
    ORDER BY links.created DESC
    
    0 讨论(0)
  • 2020-11-28 05:02

    Jeromes solution is actually wrong and can produce incorrect results!!

    sum(conversions.value)*count(DISTINCT conversions.id)/count(*) as conversion_value
    

    let's assume the following table

    conversions
    id value
    1 5
    1 5
    1 5
    2 2
    3 1
    

    the correct sum of value for distinct ids would be 8. Jerome's formula produces:

    sum(conversions.value) = 18
    count(distinct conversions.id) = 3
    count(*) = 5
    18*3/5 = 9.6 != 8
    
    0 讨论(0)
  • 2020-11-28 05:02

    How about something like this:

    select l.id, count(s.id) clicks, count(c.id) clicks, sum(c.value) conversion_value
    from    (SELECT l.id id, l.created created,
                   s.id clicks,  
                   c.id conversions,  
                   max(c.value) conversion_value                    
            FROM links l LEFT
            JOIN stats s ON l.id = s.parent_id LEFT
            JOIN conversions c ON l.id = c.link_id  
            GROUP BY l.id, l.created, s.id, c.id) t
    order by t.created  
    
    0 讨论(0)
提交回复
热议问题