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 スクリプトでこれを行う方法がわかりません。

名前で結合してテーブルに戻すことを考えました。結合はエラーにはなりませんが、発生をカウントする方法がわかりません。顧客数をカウントすることを考えていました。

私の結合は次のようになります (読みやすくするために、group by と列の選択を取り除きました。

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

This query results only newest customers with distinct (trimmed) 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

If you need to take oldest ones, remove the DESC part after ORDER BY Clause

于 2012-09-25T20:38:16.847 に答える