Выберите данные и сумму столбца для отдельного столбца в данных

У меня есть таблица вроде этого (есть клиенты, у которых есть некоторые платежи):

customerID      Payments   InvoicCode
1                 1000         112
1                 250          456
2                 100          342
1                 20           232
2                 500          654
3                 300          230

что я хочу, как ниже (сумма платежей клиентов в каждой строке):

customerID      Payments   InvoicCode   SumPayment
1                 1000         112        1270
1                 250          456        1270
2                 100          342        600
1                 20           232        1270
2                 500          654        600
3                 300          230        300

Ответ 1

Неправильная нормальная форма для дублирования данных с более широким охватом в нескольких строках. Подумайте о влиянии обновления платежа или добавлении нового платежа клиента - вам придется обновить все соответствующие итоговые значения для этого клиента.

Было бы проще создать представление/хранимую процедуру, которая даст вам итоговые значения во время выполнения, которые вы можете вызывать, когда вам это нужно:

create view CustomerTotals as

  select customerID
        ,sum(Payments) as SumPayment
    from mytable
group by customerID

Затем вы ссылаетесь на это с помощью select * from CustomerTotals с выходом, например:

customerID      SumPayment
1               1270
2               600
3               300

Ответ 2

Вот он:

SELECT t.customerID,
       t.Payments,
       t.InvoicCode,
       aux.SumPayment
FROM tablename t
INNER JOIN
(SELECT customerID,
        SUM(Payments) as SumPayment
 FROM tablename
 GROUP BY customerID) aux ON t.customerID = aux.customerID

Ответ 3

Попробуйте это, (в основном будет работать с любыми rdbms)

SELECT  a.*, b. totalPayment
FROM    paymentsTable a
            INNER JOIN
            (
                SELECT customerID, SUM(Payments) totalPayment
                FROM paymentsTable
                GROUP BY customerID
            ) b ON a.customerID = b.customerID

SQLFiddle Demo

Ответ 4

select t1.*,sumPay
from table t1,
(select customerID,sum(Payments) as sumPay
 from table
 group by customerID) t2
where t1.cutomerID=t2.customerID

Ответ 5

Вы можете создать представление или попробовать выбрать так:

SELECT customerID, 
Payments, 
InvoicCode, 
(SELECT SUM(Payments) 
    FROM Customer IC 
    WHERE IC.customerID = OC.customerID )
FROM Customer  OC

Ответ 6

Присоедините таблицу к самой суммируемой версии:

select mytable.customerID, Payments, InvoicCode, SumPayment
from mytable
join (select customerID, sum(Payments) as SumPayment from mytable group by 1) x
  on x.customerID = mytable.customerID

Ответ 7

Вы можете использовать подзапрос, чтобы получить общую сумму, а затем присоединиться к этой таблице, чтобы добавить другие столбцы.

SELECT x2.customerID
  , x2.payments
  , x2.invoice
  , x1.sumpayment
FROM
(
  select customerID
   ,sum(Payments) as SumPayment
  from yourtable
  group by customerID
) x1
inner join yourtable x2
  ON x1.customerID = x2.customerid

Смотрите SQL Fiddle with Demo

Ответ 8

Для MSSQL

SELECT Т1.*, Т2.SumPayment
FROM TableName T1 INNER JOIN 
 ( SELECT customerId, SUM(Payments) SumPayment 
    FROM TableName
    GROUP BY customerID  
) T2 ON T1.customerID = T2.customerId

Ответ 9

Предполагая, что ваши dbms - это MS Sql-Server, вы можете использовать SUM(Payments) с OVER:

SELECT customerID, Payments,InvoicCode
   ,SumPayment=SUM(Payments)OVER(PARTITION BY customerID)
FROM t

SQL-Fiddle: http://sqlfiddle.com/#!3/2ac38/2/0

Ответ 10

SqlFiddle:

SELECT
       t.customerID     as customerID,
       t.Payments       as Payments,
       t.InvoicCode     as InvoicCode,
       total            as SumPayment
FROM
       theTable t, 
       (
          SELECT   customerId,
                   sum(Payments) as total
          FROM     theTable
          GROUP BY customerId
       ) tmp
WHERE  
       tmp.customerId = t.customerId