将数据从表复制到SQL Server中的另一个表的过程

时间:2016-07-20 06:50:04

标签: sql sql-server tsql

我有一个表A,有4列: first_name,invoice,value,date。

表B(first_name,max_invoice_name,max_invoice_value,last_date)

我想创建一个过程,以便将数据从A移动到B,但是:
first_name应该是B中的一次,
max_invoice_name是最大发票值的名称
max_invoice_value是最大值
last_date是来自同一first_name的发票的最新日期。

例如: 表A:

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


表B应为:

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

4 个答案:

答案 0 :(得分:1)

这样的事情应该有效:

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

行号负责选择具有最大值的行,并且max得到日期。您需要在正确的位置列出列而不是*

答案 1 :(得分:0)

您需要创建2个标量函数getMaxNameForMaxValuegetLastDateByFirstName才能获得所需的值。

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)

答案 2 :(得分:0)

您可以使用以下内容:

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

作为输出:

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

答案 3 :(得分:-1)

试试这个

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