合并具有重叠日期的2个表

时间:2017-08-31 19:53:26

标签: sql-server tsql merge

我有客户表和销售表。我已将它们合并在一起,但它们的日期重叠。我需要获得销售额的累积总额,而重叠正在弄乱我的累积值。如果客户日期=销售日期,则使用客户日期。如果Customer Date >= Sales Date则使用销售日期。

我使用此代码合并到合并表中:

USE Sales

INSERT INTO MERGE(FirstName, LastName, CustomerNo, DATE, Sales)
    SELECT A.SOURCE, A.FirstName, A.LastName, A.CustomerNo, A.DATE, A.sales
    FROM dbo.Customers AS A
    UNION
    SELECT B.FirstName B.LastName, B.CustomerNo, B.DATE, B.Sales
    FROM dbo.Sales AS B
;

它可以工作,但我似乎无法使代码的重叠部分工作。

样本...

+----------+-----------+----------+------------+-----------+-------+-----------------+
|  SOURCE  | FIRSTNAME | LASTNAME | CUSTOMERNO |   DATE    | SALES | CUMLATIVE_SALES |
+----------+-----------+----------+------------+-----------+-------+-----------------+
| CUSTOMER | Tom       | White    |      65123 | 3/1/2017  | 38.78 |                 |
| CUSTOMER | Tom       | White    |      65123 | 3/20/2017 |   128 |          166.78 |
| CUSTOMER | Tom       | White    |      65123 | 4/8/2017  |   256 |          422.78 |
| CUSTOMER | Tom       | White    |      65123 | 4/27/2017 |   105 |          527.78 |
| CUSTOMER | Tom       | White    |      65123 | 5/16/2017 |    78 |          605.78 |
| CUSTOMER | Tom       | White    |      65123 | 6/4/2017  |    15 |          620.78 |
| SALES    | Tom       | White    |      65123 | 5/16/2017 |    78 |          698.78 |
| SALES    | Tom       | White    |      65123 | 6/4/2017  |    15 |          713.78 |
| SALES    | Tom       | White    |      65123 | 7/31/2017 |   125 |          838.78 |
| SALES    | Tom       | White    |      65123 | 8/19/2017 |   110 |          948.78 |
| SALES    | Tom       | White    |      65123 | 9/7/2017  |    90 |         1038.78 |
| SALES    | Tom       | White    |      65123 | 9/26/2017 |    80 |         1118.78 |
+----------+-----------+----------+------------+-----------+-------+-----------------+

1 个答案:

答案 0 :(得分:1)

只要您使用的是SQL Server 2012或更高版本,以下内容就适用于您。

IF OBJECT_ID('tempdb..#Merge', 'U') IS NOT NULL 
DROP TABLE #Merge;

CREATE TABLE #Merge (
    SOURCE VARCHAR(8) NOT NULL,
    FIRSTNAME CHAR(3) NOT NULL,
    LASTNAME CHAR(5), 
    CUSTOMERNO INT NOT NULL, 
    [DATE] DATE NOT NULL,
    SALES MONEY NOT NULL, 
    CUMLATIVE_SALES MONEY NOT NULL DEFAULT (0)
    );
SET DATEFORMAT MDY
INSERT #Merge (SOURCE, FIRSTNAME, LASTNAME, CUSTOMERNO, DATE, SALES) VALUES
    ('CUSTOMER', 'Tom', 'White', 65123, '03/01/2017', 38.78),
    ('CUSTOMER', 'Tom', 'White', 65123, '03/20/2017', 128),
    ('CUSTOMER', 'Tom', 'White', 65123, '04/08/2017', 256), 
    ('CUSTOMER', 'Tom', 'White', 65123, '04/27/2017', 105), 
    ('CUSTOMER', 'Tom', 'White', 65123, '05/16/2017', 78),  
    ('CUSTOMER', 'Tom', 'White', 65123, '06/04/2017', 15),  
    ('SALES',    'Tom', 'White', 65123, '07/31/2017', 125), 
    ('SALES',    'Tom', 'White', 65123, '08/19/2017', 110), 
    ('SALES',    'Tom', 'White', 65123, '09/07/2017', 90),  
    ('SALES',    'Tom', 'White', 65123, '09/26/2017', 80);  
    --('CUSTOMER', 'Tom', 'White', 65123, '3/1/2017 ', 38.78), 
    --('CUSTOMER', 'Tom', 'White', 65123, '3/20/2017',   128), 
    --('CUSTOMER', 'Tom', 'White', 65123, '4/8/2017 ',   256), 
    --('CUSTOMER', 'Tom', 'White', 65123, '04/27/2017',   105), 
    --('CUSTOMER', 'Tom', 'White', 65123, '05/16/2017',    78), 
    --('CUSTOMER', 'Tom', 'White', 65123, '06/04/2017 ',    15), 
    --('SALES', 'Tom', 'White', 65123, '05/16/2017',    78), 
    --('SALES', 'Tom', 'White', 65123, '06/04/2017 ',    15), 
    --('SALES', 'Tom', 'White', 65123, '07/31/2017',   125), 
    --('SALES', 'Tom', 'White', 65123, '08/19/2017',   110), 
    --('SALES', 'Tom', 'White', 65123, '09/07/2017 ',    90), 
    --('SALES', 'Tom', 'White', 65123, '09/26/2017',    80);

--================================================================

WITH
    cte_CUMLATIVE_SALES AS (
        SELECT 
            m.CUMLATIVE_SALES,
            cs = SUM(m.SALES) OVER (PARTITION BY m.CUSTOMERNO ORDER BY m.[DATE])
        FROM
            #Merge m
        )
UPDATE cs SET 
    cs.CUMLATIVE_SALES = cs.cs
FROM
    cte_CUMLATIVE_SALES cs;

SELECT * FROM #Merge m ORDER BY m.[DATE];

结果...

SOURCE   FIRSTNAME LASTNAME CUSTOMERNO  DATE        SALES                 CUMLATIVE_SALES
-------- --------- -------- ----------- ----------  --------------------- ---------------------
CUSTOMER Tom       White    65123       2017-03-01  38.78                 38.78
CUSTOMER Tom       White    65123       2017-03-20  128.00                166.78
CUSTOMER Tom       White    65123       2017-04-08  256.00                422.78
CUSTOMER Tom       White    65123       2017-04-27  105.00                527.78
CUSTOMER Tom       White    65123       2017-05-16  78.00                 605.78
CUSTOMER Tom       White    65123       2017-06-04  15.00                 620.78
SALES    Tom       White    65123       2017-07-31  125.00                745.78
SALES    Tom       White    65123       2017-08-19  110.00                855.78
SALES    Tom       White    65123       2017-09-07  90.00                 945.78
SALES    Tom       White    65123       2017-09-26  80.00                 1025.78