2016-07-20 19 views
0

Ich habe eine Tabelle A mit 4 Spalten: Vorname, Rechnung, Wert, Datum.Verfahren zum Kopieren von Daten aus einer Tabelle in eine andere Tabelle in SQL Server

und eine Tabelle B (first_name, max_invoice_name, max_invoice_value, last_date)

Ich möchte ein Verfahren schaffen, um Daten von A zu bewegen, B, aber:
first_name einmal in B sein sollte ,
max_invoice_name ist der Name des max Rechnungswert
max_invoice_value der Maximalwert
last_date ist der letzte Termin von Rechnungen aus dem gleichen first_name ist.

Zum Beispiel: A TABELLE:

Smith | Invoice1 | 100 | 23.06.2016 
John | Invoice13 | 23 | 18.07.2016 
Smith | Invoice3 | 200 | 01.01.2015 


Tabelle B sollte sein:

Smith |Invoice3 | 200 | 23.06.2016 
John |Invoice13| 23 | 18.07.2016 
+0

Eigentlich habe ich eine temporäre Tabelle alle zu halten verschiedene first_names und dann lese ich Zeile für Zeile. Wenn es in B => Update mit Informationen von A gibt, wenn nicht, fügen Sie eine neue Zeile – Johanna

Antwort

-1

dieses Versuchen

Insert into TableB(first_name, max_invoice_name, max_invoice_value, last_date) 
select t1.first_name,t1.invoice,t1,value,t2.date from TableA as t1 inner join 
(
select first_name, max(replace(invoice,'invoice','')) as invoice, max(date) as date 
    from TableA group by first_name 
) as t2 on t1.first_name=t2.first_name and t1.invoice=t2.invoice 
+0

Zuerst gibt es wahrscheinlich Syntaxfehler. Zweitens, das Ergebnis ist falsch - ziehen Sie in Betracht, zwei Rechnungen für denselben Vornamen, Rechnung2 am 01.01.2016 und Rechnung10 am 02.02.2016 zu haben - was bekommen Sie in Ihrer inneren Auswahl? – Arvo

0

Sie werden 2 skalare Funktionen erstellen müssen getMaxNameForMaxValue UND getLastDateByFirstName um das zu bekommen Werte, die Sie wollen.

INSERT INTO TableB (first_name, max_invoice_name, max_invoice_value, last_date) (SELECT DISTINCT first_name, getMaxNameForMaxValue(MAX(max_value)) AS 'max_invoice_name', MAX(max_invoice_value) AS 'max_invoice_value', getLastDateByFirstName(first_name) AS 'lastDate' FROM Table A) 
1

So etwas sollte funktionieren:

select *, (select max(date) from #Table1 T1 where T1.first_name = X.first_name) 
from (
    select 
    *, 
    row_number() over (partition by first_name order by invoice_Value desc) as RN 
    from 
    #Table1 
) X 
where RN = 1 

Zeilennummer kümmert sich um die Zeile mit größten Wert auswählen und die max get ist das Datum. Hier finden Sie die Spalten in der richtigen Stelle auflisten müssen statt *

0

Sie so etwas wie dieses verwenden können:

--INSERT INTO TableB 
SELECT first_name, 
     invoice_name, 
     invoice_value, 
     last_date 
FROM (
    SELECT a.first_name, 
      a.invoice_name, 
      a.invoice_value, 
      COALESCE(p.last_date,a.last_date) as last_date, 
      ROW_NUMBER() OVER (PARTITION BY a.first_name ORDER BY a.last_date) as rn 
    FROM TableA a 
    OUTER APPLY (SELECT TOP 1 * FROM TableA WHERE first_name = a.first_name and last_date > a.last_date) as p 
) as res 
WHERE rn = 1 

Als Ausgabe:

first_name invoice_name invoice_value last_date 
John  Invoice13  23    2016-07-18 
Smith  Invoice3  200    2016-06-23 
Verwandte Themen