2012-08-27 19 views
10

Tengo una tabla de este tipo, (hay clientes suma que cada uno tiene algunos pagos):selección de datos y la suma de una columna para una columna distinta en los datos

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

Lo que quiero es como el de abajo (suma de los pagos de un cliente en cada fila):

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 
+5

qué base de datos? – Bohemian

Respuesta

5

No es una forma normal adecuada tener datos de mayor alcance duplicados en varias filas. Piense en el impacto de actualizar un pago o agregar un nuevo pago del cliente: tendrá que actualizar todos los totales relevantes para ese cliente.

Sería más sencillo para crear un procedimiento vista/almacenado que le da los totales en tiempo de ejecución que se puede llamar cuando lo necesite:

create view CustomerTotals as 

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

allí tendría que hacer referencia a este con select * from CustomerTotals con una salida como:

customerID  SumPayment 
1    1270 
2    600 
3    300 
+2

Tal vez sea así, pero técnicamente esto no responde la pregunta. Además, no presuma demasiado: puede querer que esa columna determine el porcentaje que comprende cada fila. – Bohemian

+1

¿Por qué no seleccionar simplemente el OP que se solicitó? –

+0

@ Bohemian, aF .: Tienes razón, esperaré la respuesta de OP y eliminaré mi respuesta si es irrelevante.Leí la pregunta como actualizar los totales en la tabla original como otra columna, que releyé no es necesariamente la intención. Gracias por su entrada :) – mellamokb

2

Para 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 
+0

no funcionará en absoluto – Bohemian

+3

esto funcionará si el OP está utilizando MySQL, pero si MSSQL no lo hará. –

+0

También actualicé mi respuesta para MSSQL. Gracias – hgulyan

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

Puede crear una vista o tratar un selecto como esto:

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

unir la tabla a una versión resumida de sí mismo:

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 
5

Aquí está:

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

Puede usar una subconsulta para obtener la suma total y luego unirla a su tabla para agregar las otras columnas.

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 

Ver SQL Fiddle with Demo

2

Asumiendo su DBMS es MS SQL Server, puede utilizar un SUM(Payments) con OVER cláusula:

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

SQL-violín: http://sqlfiddle.com/#!3/2ac38/2/0

2

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 
4

Prueba de esto, (trabajará sobre todo en cualquier 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

Cuestiones relacionadas