1

我很难在互联网上搜索这个,所以想我会在这里问 T-SQL 问题。我有一张叫 CUST 的桌子。CUST 包含客户输入日期、姓名、公司、地址、电子邮件等。我写了一个简单的查询来根据 entrydate 查找新客户;

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))

有什么建议么?

4

3 回答 3

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 
) 
于 2012-09-25T20:10:27.447 回答
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))
)
于 2012-09-25T21:34:20.237 回答
0

此查询仅产生具有不同(修剪)FirstName+LastName+Company 的最新客户

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

于 2012-09-25T20:38:16.847 回答