我有客户表和销售表。我已将它们合并在一起,但它们的日期重叠。我需要获得销售额的累积总额,而重叠正在弄乱我的累积值。如果客户日期=销售日期,则使用客户日期。如果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 |
+----------+-----------+----------+------------+-----------+-------+-----------------+
答案 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