2016-08-24 9 views
1

列ごとに1つずつ反復し、列のshopIDが変更されたときにリセットするシーケンス番号のようなものを作成しようとしています。しかし、私は変数を使用したいと思います。列の値に応じたSQLオートカウンター

select 
    @Counter --what to do here? 
    ,@data as Data 
    ,case 
     when (ShopID.N.value('.', 'decimal(5,0)') = -1) then NULL 
     else ShopID.N.value('.', 'decimal(5,0)') 
    end as ShopID 
from @xmlRes.nodes('/Root/ResponseData/response/shopItems') as S(N) 
    outer apply S.N.nodes('recordNumber') as ShopID(N) 

私はこのようなものを取得する必要があります:

Counter | Data | ShopID 
-------------------------------------- 
    1 | Sample |  1 
    2 | Sample |  1 
    3 | Sample |  1 
    1 | Sample |  2 
    2 | Sample |  2 
    3 | Sample |  2 
    4 | Sample |  2 
    1 | Sample |  3 
+1

なぜrow_number()の代わりに変数を使用するのですか –

答えて

3
select 
    ROW_NUMBER() OVER (PARTITION BY ShopID ORDER BY Data) as Counter, 
    ,@data as Data 
    ,case 
     when (ShopID.N.value('.', 'decimal(5,0)') = -1) then NULL 
     else ShopID.N.value('.', 'decimal(5,0)') 
    end as ShopID 
from @xmlRes.nodes('/Root/ResponseData/response/shopItems') as S(N) 
    outer apply S.N.nodes('recordNumber') as ShopID(N) 
1
row_number() over (partition by ShopID) 

はまた、あなたはあなたの順序番号が特定の順序で割り当てたい場合は、パーティションの後にORDER BY句を追加する必要があります。

+0

'ROW_NUMBER()'では 'ORDER BY'はオプションではありません。[HERE](https://msdn.microsoft.com/en-us/library/)をチェックしてください。 ms186734.aspx):ORDER BY句は、指定されたパーティション内で行に一意のROW_NUMBERが割り当てられる順序を決定します。それは必須です。 –

+0

あなたは正しいです、あなたの答えはすでに投票されています。乾杯! – hchaznedaroglu

関連する問題