programing

개별 행의 MYSQL sum()

procenter 2023. 1. 3. 22:34
반응형

개별 행의 MYSQL sum()

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(convers.value)이 각 행의 "값"을 두 번 이상 카운트한다는 것입니다(그룹화 기준).

저는 기본적으로SUM(conversions.value)각 DISIGNT conversions.id에 대해 설명합니다.

그게 가능한가요?

내가 틀릴 수도 있지만 내가 아는 바로는

  • conversions.id은 테이블 변환의 주요 입니다.
  • stats.id은 테이블 통계의 주요 키입니다.

따라서 각 conversions.id에 대해 최대 1개의 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 

각 링크에 대해 size of([size]) x size of([signions]) 행이 표시됩니다.

고객님이 지적하신 바와 같이, 요청의 고유 변환 수는

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

이 구별은 데카르트 곱의 모든 [수직] 선을 제거하는 데 성공한다

하지만 분명히

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;

계속 보고해! 제롬!

지로메스 용액은 실제로는 잘못되어 잘못된 결과가 나올 수 있습니다!!

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입니다.제롬의 공식은 다음과 같다.

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

잘못된 번호가 표시되는 이유에 대해서는, 이것을 참조해 주세요.

제롬이 당신의 실수를 잘 알고 있다고 생각합니다.SELECT에 서브쿼리가 있는 것은 비효율적일 수 있지만 Bryson의 쿼리는 효과가 있습니다.

다음 쿼리를 사용합니다.

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;

저는 이것이 당신이 원하는 답을 줄 것이라고 믿습니다.

언급URL : https://stackoverflow.com/questions/2436284/mysql-sum-for-distinct-rows

반응형