2012-09-25 45 views
1

我在這個網絡上搜索很困難,所以我以爲我會問這裏的T-SQL問題。我有一張名爲CUST的表格。 CUST包含客戶入口日期,姓名,公司,地址,電子郵件等。我寫了一個簡單的查詢來根據entrydate查找新客戶;針對以前的查詢結果的T-SQL查詢

Select * from CUST WHERE ENTRYDATE between '2012-08-01' and '2012-08-30' 

這很好,除了我發現一個問題。當我們的網上商店創建新訂單時,如果客戶詳細信息不完全匹配,則會創建新客戶。既然如此,我想採取我的原始結果,並修剪結果集,如果我有多個cust.firstname + cust.lastname + cust.company事件。我可以在單個查詢中編寫這些代碼,只是不確定如何在單個SQL腳本中執行此操作。

我考慮過在名稱上做一個連接回到表中,雖然連接沒有錯誤,但我不知道如何計算出現次數,我正在考慮計算客戶數量。

我加入這個樣子的(由和列選擇剝離出集團,使其更容易閱讀;

from CUST 
    Right Outer Join 
    (
    select * 
    from CUST 
    WHERE ENTRYDATE between '2012-08-01' and '2012-08-30' 
      AND LTRIM(RTRIM(Firstname + Lastname + Company)) <> '' 
    Group By *  
    ) as newcs 

    on LTRIM(RTRIM(CUST.Firstname + CUST.Lastname + CUST.Company)) = LTRIM(RTRIM(newcs.Firstname + newcs.Lastname + newcs.Company)) 

任何建議

+0

您使用的是哪個版本的SQL Server? – JNK

+0

你用什麼來進行顧客登錄?如果您使用電子郵件地址,則可以阻止系統爲同一客戶創建新帳戶。 –

+0

對不起,使用SQL-Server 2003.我無法控制Webstore或客戶訂單系統(創建其他地方的客戶)。我確實可以訪問數據庫。 – MLindsay

回答

1

重複的記錄:

SELECT DISTINCT c1.* 
FROM @CUST c1 
WHERE c1.ENTRYDATE BETWEEN '2012-08-01' AND '2012-08-30' 
AND NOT EXISTS (SELECT 1 
    FROM @CUST c2 
    WHERE c2.ENTRYDATE < '2012-08-01' 
    AND LTRIM(RTRIM(c1.Firstname + c1.Lastname + c1.Company)) = LTRIM(RTRIM(c2.Firstname + c2.Lastname + c2.Company)) 
) 
+0

謝謝黛安娜,這個伎倆。將節省我的客戶服務人員的工作時間。 – MLindsay

1

如果您想刪除重複的記錄,你呢?可以使用下面的腳本:

DELETE FROM Customer 
WHERE PKCol IN 
( 
    SELECT PK_Column FROM 
    ( 
     SELECT ROW_NUMBER() OVER(PARTITION BY FirstName, LastName, Company ORDER BY EntryDate) AS RN, PK_Column 
     FROM Customers 
    ) A 
    WHERE A.RN > 1 
) 
+0

不試圖刪除,只是試圖創建一個準確轉儲我的客戶服務人員的新用戶列表的報告。 – MLindsay

0

此查詢結果只最新客戶提供不同的(TRIM MED)姓+名字+公司

SELECT FirstName,LastName,Company,EntryDate FROM(
    SELECT *, R=ROW_NUMBER() OVER (PARTITION BY ID ORDER BY EntryDate DESC) FROM(
     SELECT FirstName,LastName,Company , EntryDate, ID= LTRIM(RTRIM(FirstName)) + LTRIM(RTRIM(LastName)) + LTRIM(RTRIM(Company)) 
     FROM CUST 
     WHERE EntryDate BETWEEN '2012-08-01' and '2012-08-30' 
     ) AS a 
    ) AS b 
WHERE R=1 

如果您需要採取最舊的,去掉DESC部分後ORDER BY條款

在沒有事先到報告期內進入當前時間段
+0

感謝您的回覆,我將開始調查並報告哪些工作正常! – MLindsay