2012-08-27 15 views
10

Mam tabeli tak, (nie ma klientów sum że każdy ma jakieś płatności):wybierz dane i suma kolumny do odrębnego kolumny w danych

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

co chcę, jak poniżej (suma płatności klienta w każdym wierszu):

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

której bazy danych? – Bohemian

Odpowiedz

5

To nie jest normalna forma, aby dane o szerszym zakresie były duplikowane w wielu wierszach. Pomyśl o wpływie aktualizacji płatności lub dodaniu nowej płatności dla klienta - będziesz musiał zaktualizować wszystkie odpowiednie sumy dla tego klienta.

Byłoby prościej utworzyć widok/procedurę przechowywaną, która daje sumy w czasie wykonywania których można zadzwonić, gdy trzeba je:

create view CustomerTotals as 

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

Następnie należy odwoływać się do tego z select * from CustomerTotals z wyjściem typu:

customerID  SumPayment 
1    1270 
2    600 
3    300 
+2

Może tak, ale technicznie to nie odpowiada na pytanie. Ponadto, nie zakładaj zbyt wiele - może on chcieć, aby ta kolumna określała procentowy udział każdego wiersza. – Bohemian

+1

Dlaczego nie wystarczy wybrać, o co prosił OP? –

+0

@ Bohemian, aF .: Masz rację, będę czekać na odpowiedź z OP i usuń moją odpowiedź, jeśli nie ma to znaczenia.Przeczytałem to pytanie, aktualizując sumy do oryginalnej tabeli jako kolejną kolumnę, której ponowne przeczytanie niekoniecznie jest intencją. Dzięki za twoje wejście :) – mellamokb

2

Dla 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

nie zadziała w ogóle – Bohemian

+3

to zadziała, jeśli OP używa MySQL, ale jeśli MSSQL to nie będzie. –

+0

Zaktualizowałem też moją odpowiedź na MSSQL. Dzięki – 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

Można utworzyć widok lub spróbuj select tak:

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

Dołącz tabelę do zsumowanej wersją siebie:

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

Oto ona:

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

Możesz użyć kwerendy podrzędnej, aby uzyskać całkowitą sumę, a następnie połączyć ją z tabelą, aby dodać pozostałe kolumny.

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 

Zobacz SQL Fiddle with Demo

2

Zakładając DBMS jest MS SQL Server, można użyć SUM(Payments) z OVER klauzuli:

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

SQL-Fiddle: 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

Spróbuj tego (będzie głównie działać na każdym 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

Powiązane problemy