我正在使用SQL Server 2005。
我在同一SQL Server中有8个数据库。 每个数据库(属性)中都有一个包含数千个客户的表。
简单起见
function kmlPlClick(pm, doc)
直到现在,每个媒体资源分别填充其客户。现在有必要合并客户以进行报告。
我想在所有数据库中找到所有普通客户
(条件=客户姓氏+客户电子邮件+客户的首字母 名称)
并为每个普通客户填充一个新表(合并),该表包含Property数据库的PropertyID和CustomerID。
CustomerID numeric(18,0)
PropertyID int
CustomerSurname varchar(100)
CustomerName varchar(50)
CustomerEmail varchar(100)
想象: 物业1的客户
ConsolidationID numeric(18,0)
PropertyID int
CustomerID numeric(18,0)
物业2的客户
1000 1 Smith Adrian smith@jj.com
合并表
9876 2 Smith A smith@jj.com
因此,在合并表中,我们有Smith的ID = 1,Smith在Database1(属性)中具有本地ID 1000,在Database2(属性)中具有localID 9876
我对于如何使用8个数据库之间的条件找到共同的客户感到困惑,实现这一目标的策略。
答案 0 :(得分:2)
在这种情况下,整合数据是非常简单的过程。
这是您可以在SSMS中运行以入门的示例。请注意,我使用的是TABLE变量而不是单独的数据库,但是概念保持不变。
DECLARE @database1 TABLE ( CustomerID NUMERIC(18,0), PropertyID INT, CustomerSurname VARCHAR(100), CustomerName VARCHAR(50), CustomerEmail VARCHAR(100) );
DECLARE @database2 TABLE ( CustomerID NUMERIC(18,0), PropertyID INT, CustomerSurname VARCHAR(100), CustomerName VARCHAR(50), CustomerEmail VARCHAR(100) );
INSERT INTO @database1 ( CustomerID, PropertyID, CustomerSurname, CustomerEmail, CustomerName )
VALUES ( 1, 1000, 'Smith', 'Adrian', 'smith@jj.com' );
INSERT INTO @database2 ( CustomerID, PropertyID, CustomerSurname, CustomerEmail, CustomerName )
VALUES ( 2, 9876, 'Smith', 'A', 'smith@jj.com' );
SELECT
ROW_NUMBER() OVER ( PARTITION BY CustomerSurname, CustomerEmail, FirstInitial ORDER BY CustomerSurname, CustomerEmail, FirstInitial ) AS ConsolidationID
, Consolidated.CustomerID
, Consolidated.PropertyID
FROM (
SELECT CustomerID, PropertyID, CustomerSurname, CustomerName, CustomerEmail, LEFT( CustomerName, 1 ) AS FirstInitial FROM @database1
UNION
SELECT CustomerID, PropertyID, CustomerSurname, CustomerName, CustomerEmail, LEFT( CustomerName, 1 ) AS FirstInitial FROM @database2
) AS Consolidated
ORDER BY
CustomerID, CustomerSurname, CustomerEmail, FirstInitial;
+-----------------+------------+------------+
| ConsolidationID | CustomerID | PropertyID |
+-----------------+------------+------------+
| 1 | 1 | 1000 |
| 1 | 2 | 9876 |
+-----------------+------------+------------+
要将其与八个数据库一起使用,只需将表变量(@ database1,@ database2等)替换为要引用的数据库和表的标准名称。
SELECT {column-list} FROM MyDatabase1.dbo.TableName...
UNION
SELECT {column-list} FROM MyDatabase2.dbo.TableName...
等等...
ROW_NUMBER()是真正的“魔术”。通过使用其PARTION BY和ORDER BY,我们可以为与分区条件匹配的每一行(在这种情况下为CustomerSurname,CustomerEmail和FirstInitial)获得一个“ ConsolidationID”。必须使用ORDER BY才能确保正确排序数据,以便分区能够按预期工作。
我希望这可以帮助您上路。