[英]SQL consolidating data best Strategy
我正在使用SQL Server 2005。
我在同一SQL Server中有8個數據庫。 每個數據庫(屬性)中都有一個包含數千個客戶的表。
簡單起見
CustomerID numeric(18,0)
PropertyID int
CustomerSurname varchar(100)
CustomerName varchar(50)
CustomerEmail varchar(100)
到現在為止,每個屬性都分別填充其客戶。 現在,需要合並客戶以進行報告。
我想在所有數據庫中找到所有普通客戶
(條件=客戶姓氏+客戶電子郵件+客戶名稱的首字母)
並填充一個新表(合並),該表包含每個普通客戶的屬性數據庫的PropertyID和CustomerID。
ConsolidationID numeric(18,0)
PropertyID int
CustomerID numeric(18,0)
想象:物業1的顧客
1000 1 Smith Adrian smith@jj.com
物業客戶2
9876 2 Smith A smith@jj.com
合並表
1 1 1000
1 2 9876
因此,在合並表中,我們具有Smith的ID = 1,Smith在Database1(屬性)中具有本地ID 1000,在Database2(屬性)中具有localID 9876
我很困惑如何使用8個數據庫之間的條件找到共同的客戶。實現這一目標的策略。
在這種情況下,整合數據是非常簡單的過程。
這是您可以在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以確保正確排序數據,以便分區按預期工作。
我希望這有助於您前進。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.