簡體   English   中英

MYSQL sum() 用於不同的行

[英]MYSQL sum() for distinct rows

我正在尋找在我的 SQL 查詢中使用 sum() 的幫助:

SELECT links.id, 
       count(DISTINCT stats.id) as clicks, 
       count(DISTINCT 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 links.id 
ORDER BY links.created desc;

我使用DISTINCT是因為我正在做“分組依據”,這確保了同一行不會被多次計算。

問題是 SUM(conversions.value) 不止一次計算每一行的“值”(由於 group by)

我基本上想為每個 DISTINCT conversions.id 做SUM(conversions.value)

那可能嗎?

我可能錯了,但據我了解

  • Conversions.id是表轉換主鍵
  • stats.id是表stats主鍵

因此,對於每個conversions.id,您最多有一個links.id 受到影響。

您的要求有點像做 2 套笛卡爾積:

[clicks]
SELECT *
FROM links 
LEFT OUTER JOIN stats ON links.id = stats.parent_id 

[conversions]
SELECT *
FROM links 
LEFT OUTER JOIN conversions ON links.id = conversions.link_id 

對於每個鏈接,您會得到 sizeof([clicks]) x sizeof([conversions]) 行

正如您所指出的,您的請求中的唯一轉換次數可以通過

count(distinct conversions.id) = sizeof([conversions])

這個 distinct 設法刪除笛卡爾積中的所有 [clicks] 行

但很明顯

sum(conversions.value) = sum([conversions].value) * sizeof([clicks])

在你的情況下,因為

count(*) = sizeof([clicks]) x sizeof([conversions])
count(*) = sizeof([clicks]) x count(distinct conversions.id)

你有

sizeof([clicks]) = count(*)/count(distinct conversions.id)

所以我會用

SELECT links.id, 
   count(DISTINCT stats.id) as clicks, 
   count(DISTINCT conversions.id) as conversions, 
   sum(conversions.value)*count(DISTINCT conversions.id)/count(*) 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 links.id 
ORDER BY links.created desc;

讓我張貼! 傑羅姆

Jeromes 解決方案實際上是錯誤的,可能會產生不正確的結果!!

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

讓我們假設下表

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

不同 id 的正確值總和為 8。 Jerome 的公式產生:

sum(conversions.value) = 18
count(distinct conversions.id) = 3
count(*) = 5
18*3/5 = 9.6 != 8

有關您看到錯誤數字的原因的解釋, 請閱讀此內容

我認為傑羅姆可以處理導致您錯誤的原因。 Bryson 的查詢可以工作,盡管在 SELECT 中使用該子查詢可能效率低下。

使用以下查詢:

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

我使用子查詢來做到這一點。 它消除了分組問題。 所以查詢會是這樣的:

SELECT COUNT(DISTINCT conversions.id)
...
     (SELECT SUM(conversions.value) FROM ....) AS Vals

像這樣的東西怎么樣:

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  

這可以解決問題,只需將總和除以重復的對話 id 的計數。

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
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;

我相信這會給你你正在尋找的答案。

暫無
暫無

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

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