SQL Как сделать условную сумму по отдельному идентификатору? - PullRequest
6 голосов
/ 12 мая 2011

Предположим, у вас есть результирующий набор, такой как:

DATE          ID    cost    
---------------------------------------
 01/01/2011    1     10      
 01/01/2011    1     10      
 01/01/2011    2     10      
 01/01/2011    2     10      

Мне нужен способ суммировать значения стоимости, но только один раз для каждого отдельного идентификатора, чтобы при группировании по дате я получал такой результат, как

DATE            cost

01/01/2011         20

Сначала я попробовал что-то вроде

    sum(distinct cost) 

, но проклятие только возвращает 10 Я также попробовал:

sum(case when distinct id then cost else 0 end)

ноэто не функциональный запрос.

Ответы [ 7 ]

17 голосов
/ 12 мая 2011

Я предполагаю, что один и тот же идентификатор всегда будет иметь одинаковую стоимость в один и тот же день.Я также предполагаю, что ваша СУБД поддерживает производные таблицы.В таком случае это то, что вам нужно:

select date, sum(cost)
from 
  (select distinct date, id, cost from YourTable)
group by date

Обновлено

Производные таблицы Oracle не требуют псевдонимов.

1 голос
/ 02 июля 2011

Я думаю, что есть некоторая ошибка в логике опубликованного вопроса.

Предположим, у вас есть этот набор результатов:

DATE          ID    cost    
---------------------------------------
 01/01/2011    1     10      
 01/01/2011    1     15     
 01/01/2011    2     10      
 01/01/2011    2     10      

Что должен вернуть запрос?

DATE          cost    
---------------------------------------
 01/01/2011    20    

или

DATE          cost    
---------------------------------------
 01/01/2011    25   

Принятый ответ вернет 35.

Или такой набор невозможно получить?

1 голос
/ 12 мая 2011

Я думаю, что все, что вы хотите здесь сделать, - это сгруппировать по дате и идентификатору, как писал MPelletier.

FWIW - вы можете сделать различное внутри агрегата в некоторых БД: http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_sum

И что еще лучше, используйте группирование с накоплением, чтобы получить итоги вместе с группировкой: http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

SELECT DATE, ID, SUM(cost)
FROM table_name
GROUP BY DATE, ID WITH ROLLUP;
0 голосов
/ 30 июня 2016

Вы можете использовать этот запрос.

 SELECT dates, Sum(cost) as TCost FROM TABLE_NAME GROUP BY  ID
0 голосов
/ 07 июня 2014

Попробуйте
Я использую Mysql для этого. DEMO TABLE (имя таблицы - «имя таблицы». Id и стоимость - тип «int»)

id | cost  
 1 | 15  
 1 | 25  
 1 | 10  
 2 | 25  
 2 | 5  
 2 | 10  
 3 | 20    
 3 | 15    
 3 | 10    
 4 | 20    
 4 | 20   


Использование запроса

select id
     , SUM(cost) as 'Total Cost' 
  from sumchk 
 group by id  

ИЛИ (используйте ниже одного)

select id, sum(cost) as 'Total Cost'  
  from (select * 
          from tablename
  ) a  
group by id;

Результат:

  id  |  Total Cost  
   1  |    50  
   2  |    40  
   3  |    45  
   4  |    40  
0 голосов
/ 30 апреля 2013

ПОПРОБУЙТЕ

SELECT SUM(cost) AS Expr1
     , ID
     , date
 FROM (SELECT DISTINCT date
            , ID
            , cost
         FROM table_name AS table_name_1
        GROUP BY date, ID, cost) AS derivedtbl_1
 GROUP BY ID, date

или ЭТО

SELECT     SUM(cost) AS Expr1,  date
  FROM ( SELECT DISTINCT date, ID, cost
           FROM table_name AS table_name_1
           GROUP BY date, ID, cost) AS derivedtbl_1
 GROUP BY date
0 голосов
/ 12 мая 2011

Не зная базы данных / движка SQL:

ВЫБРАТЬ Дата, Сумма (Стоимость) ОТ YourTable GROUP BY Дата, ID;

SELECT Date, First(TCost)
FROM
(SELECT Date, Sum(Cost) as TCost FROM YourTable GROUP BY Date, ID)
GROUP BY Date
...