2012-02-28 14 views
1

長さ順はWITH句内では機能しません。WITH句内の長さによる注文方法SQL Server 2008?

;WITH Invalids AS 
(
    SELECT TOP 1 WITH TIES 
     GroupNumber, 
     RTRIM(Address1) Address1, 
     RTRIM(Postcode) Postcode 
    FROM dbo.LoadData WHERE GroupNumber NOT IN 
    (
     '000','016','018','025','044','048','049','053','054','055','060','064','067','069','071','073' 
    ) 
    ORDER BY ROW_NUMBER() OVER (PARTITION BY GroupNumber ORDER BY LEN(Address1) DESC, LEN(Postcode) DESC) 
) 
UPDATE dbo.LoadData 
SET 
    Valid = 0, 
    Reason = Reason + 'Bad address; ' 
WHERE GroupNumber = 
(
    SELECT GroupNumber FROM Invalids WHERE LEN(Address1) = 0 OR LEN(Postcode) = 0 
+2

サンプルデータ、実際の出力、予想される出力を提供していれば、問題を理解するのに役立ちます。私はあなたの質問をテストしました。私が見ることができるところから、あなたの 'order by 'ステートメントは、それがすべきことをします。注意: 'len'は末尾の空白を数えないので、' 0'、 'select len( '')'となります。 –

答えて

3

TOP... WITH TIESはあなたにORDER BY句に一致する値を持っているすべてを与えるために起こっています。 'ORDER BY'句はGroupNumberで区切られた行番号であるため、少なくとも1つのレコードを持つすべてのGroupNumberは、行番号1のレコードの1つを持ちます。したがって、すべてのGroupNumberに対して1つのレコードを返します。 MSDNはまた、「レコードを結びつける返される順序は任意です.ORDER BYはこのルールに影響しません」と述べています。

私はCTEであなたの「BY ORDER」は、単純であることを推測するつもりだ:、

ORDER BY GroupNumber, LEN(Address1) DESC, LEN(Postcode) DESC

もしそうなら、あなたは最低GroupNumber、およびアドレス1に対する最長値になるだろう郵便番号の最長値、および重複値一方

は、あなたが 場合は、あなたはすでにそれを取得する必要があり、 すべての GroupNumberための最長アドレスと郵便番号をしたいと私はより多くの情報を求めるでしょう。

関連する問題