개별 행의 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
'programing' 카테고리의 다른 글
후행 줄바꿈을 삭제하려면 어떻게 해야 합니까? (0) | 2023.01.03 |
---|---|
JavaScript에서 배열의 최소/최대 요소를 찾습니다. (0) | 2023.01.03 |
테이블의 일부 특정 항목에서 다른 테이블의 열 값을 사용하여 열을 업데이트합니다. (0) | 2023.01.03 |
프로그래밍 방식으로 리소스 디렉터리 경로를 가져오는 방법 (0) | 2023.01.03 |
Twig 템플릿에서 break 또는 continue in for loop을 사용하려면 어떻게 해야 하나요? (0) | 2023.01.03 |