2016-11-29 6 views
1

私が書いた長いクエリから以下の抽出があります。ランク関数を作成してサブクエリでフィルタリングできるようにしようとしていますSQL Server 2008のNullとの最後の一致

ブランクとヌルが最後にランク付けされるランクをどのように活用しますか?

ランク

id Category  Review 
1  Site   "null value" 
1  "blank value"  Yes 
1  Sited   Yes 

予想される出力:

id Category  Review   Rnk 
1  Site   "null value"  3 
1  "blank value"  Yes    2 
1  Sited   Yes    1 
+0

期待する出力はありますか?私は、誰が最初に行くのかというルールを意味しますか?あなたはどの列を注文していますか? – DVT

+0

更新された質問。 Dense_Rankでブランクとヌルが最後にランク付けされるランクを表示したい – Toby

+0

正しい順序でランク付けするか、ランクを割り当てることに問題がありますか? – Fritz

答えて

3
DECLARE @Table AS TABLE (Id INT, Category VARCHAR(15), Review VARCHAR(15)) 
INSERT INTO @Table VALUES (1,'Site',NULL),(1,NULL,'Yes'),(1,'Sited','Yes') 

SELECT 
    Id 
    ,Category 
    ,Review 
    ,Rnk = ROW_NUMBER() OVER (ORDER BY 
      CASE WHEN ISNULL(Review,'') = '' THEN 1 ELSE 0 END 
      ,CASE WHEN ISNULL(Category,'') = '' THEN 1 ELSE 0 END) 
FROM 
    @Table 
ORDER BY 
    Rnk DESC 

フィールドに、ヌルがnullではないよりも大きな値にする場合はNULL値をテストするためにCASE式を使用。 CategoryReviewでこれを行います。タイの場合はROW_NUMBER()DENSE_RANK()に切り替えます。情報を追加してパーティションやその他の注文を追加し、より多くのテストケースを絞り込みます。あなたのCASE式で

あなたが

CASE 
    WHEN Review IS NULL THEN 2 --Nulls last 
    WHEN Review = '' THEN 1 -- Empty String 2nd To Last 
    ELSE 0 -- 
END 
+1

カラムがNULLでも空白でもかまいませんので、おそらく 'coalesce ... = '''を使用しますか? – scsimon

+1

@scsimon良い点がありがとう! – Matt

0
SELECT 
    a.id 
    , a.Category 
    , a.Review 
    , RANK() OVER (ORDER BY a.CategoryRank DESC, a.Category, a.Review DESC, a.Review) AS Rnk 
FROM 
    (
    SELECT 
     id, Category, Review, 
     CASE 
      WHEN Category IS NULL THEN 0 
      ELSE 1 
     END AS CategoryRank, 
     CASE 
      WHEN Review='' THEN 0 
      ELSE 1 
     END AS ReviewRank  
    ) a 
+0

ROWNUMBER()も使用することができます。 – DVT

0

ような何かを行うことができ続くように第二を絶対に最後のヌルと空白(空の文字列)をソートする場合のように、あなたは物事のすべての種類を行うことができます場合はdescで注文すると、nullが最後に現れます。

DENSE_RANK() OVER (PARTITION BY ID, REVIEW ORDER BY F.TypeOfReview desc, OnSiteChoices desc) Rnk 
関連する問題