Сгруппировать / отличить в сочетании с суммой? - PullRequest
3 голосов
/ 13 июля 2010

У меня есть SQL-заявление вроде этого:

select a.id, a.valfrom ...
  inner join ...
  where ...;

В результате получилось:

id    val
---------
 3     10
 3     10
 3     10
 9     21
 9     21
11      2
11      2
13     30

Как видите, один идентификатор имеет одно значение.

Если я делаю группу по (a.id), я получаю:

id    val
---------
 3     10
 9     21
11      2
13     30

Что я хочу получить от последнего результата, так это сумму: 10 + 21 + 2 + 30 = 63.

Так как я могу получить сумму как один результат? Если я делаю сумму (a.val) и использую group by (a.id), я не получаю 63, я получаю сумму для каждого идентификатора, например id = 3 -> 10 + 10 + 10 = 30.

С наилучшими пожеланиями.

Ответы [ 5 ]

10 голосов
/ 13 июля 2010

Тогда вы не хотите GROUP BY.Вы также не можете правильно выбрать идентификатор в стандартном SQL.Вы просто хотите:

SELECT SUM(val) FROM (SELECT DISTINCT id, val FROM ...) AS foo

Но MySQL поддерживает несколько расширений стандартного синтаксиса SQL, которые МОГУТ сделать эту работу:

SELECT DISTINCT id, SUM(val) FROM ...

1 голос
/ 13 июля 2010

Если ваш запрос

select a.id, a.valfrom ...
  inner join ...
  where ...;

попробуйте это:

select sum(distinct a.valfrom)
  inner join ...
  where ...;

Нет "group by", руки вниз.

0 голосов
/ 26 марта 2013

Вам просто нужно использовать Distinct, по которому вы должны выполнить суммирование.

select ID,Sum(Distinct Val) 
from Table
Group By ID;
0 голосов
/ 13 июля 2010

Это сделает свое дело:)

select a.id, a.valfrom, SUM(val) as mySum ...
  inner join ...
  where ...
GROUP BY NULL
0 голосов
/ 13 июля 2010

Использование подвыбора и отличного:

  select sum(valform) from (
    select distinct a.id, a.valfrom ...
    inner join ...
    where ...
  )

Или используя группирование по:

  select sum(valform) from (
    select a.id, min(a.valfrom)
    inner join ...
    where ...
    group by a.id
  )

Но я считаю, что первый запрос будет быстрее.

...