"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como calcular a soma de um valor em SQL garantindo que cada linha seja contada apenas uma vez?

Como calcular a soma de um valor em SQL garantindo que cada linha seja contada apenas uma vez?

Publicado em 2024-11-16
Navegar:328

How To Calculate the Sum of a Value in SQL While Ensuring Each Row is Counted Only Once?

Agrupando linhas em SQL usando SUM() para valores distintos

Em sua consulta MySQL, você deseja calcular a soma de um valor em tabela de conversões, garantindo que cada linha seja contada apenas uma vez. Para conseguir isso, você está usando a palavra-chave DISTINCT em conjunto com a função SUM(). No entanto, você está enfrentando um problema em que linhas duplicadas estão inflando o resultado SUM().

Para resolver esse problema, considere os relacionamentos de chave primária em suas tabelas. Se Conversions.id for a chave primária da tabela de conversões e stats.id for a chave primária da tabela de estatísticas, então cada Conversions.id será exclusivo para um único links.id.

Com base nesse entendimento, você pode reestruturar sua consulta para calcular a soma de conversões.valor para cada conversões.id distinto e, em seguida, dividir o resultado pela contagem total de linhas em cada grupo links.id. Isso fornecerá a soma desejada de valores distintos.

Aqui está a consulta revisada:

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;

Esta consulta deve calcular efetivamente a soma de Conversions.value para cada Conversions.id distinto dentro de cada grupo Links.id, garantindo que cada linha seja contada apenas uma vez.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3