【问题标题】:Merge 2 tables that have overlapping dates合并 2 个日期重叠的表
【发布时间】:2017-08-31 19:53:26
【问题描述】:

我有一个 Customer 表和一个 Sales 表。我已将它们合并在一起,但它们的日期重叠。我需要获得销售额的累计总额,而重叠会影响我的累计值。如果客户日期 = 销售日期,则使用客户日期。如果 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 |
+----------+-----------+----------+------------+-----------+-------+-----------------+

【问题讨论】:

  • 您使用的是什么数据库?如果您使用的是 MS SQL,我将创建一个函数来执行逻辑并将两个日期作为参数传递
  • 我正在使用 SQL Server 管理工作室
  • 请显示一些示例数据和预期输出。您当前的查询只是 UNION 两个表,对我来说似乎没有合并
  • 您的代码没有指明您想在哪里摆弄日期。旁白:UNION,而不是UNION ALL,删除重复项。使用关键字,例如MERGEDATE,对于不推荐的对象,case when CustomerDate > SalesDate then SalesDate when CustomerDate = SalesDate then CustomerDate else NULL end 会做一些事情。正如你写的那样,如果它们相等,你想使用 both 值!
  • 凯蒂,您需要编辑您的问题并发布这些示例。您可能想用ozh.github.io/ascii-tables 或其他网站对其进行格式化......不幸的是,没有人能阅读该评论并理解它。

标签: sql-server tsql merge


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-12-07
    • 2011-09-30
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    相关资源
    最近更新 更多