0

テーブル スキーマ:

StatusId    Status  DisplayColor    IsOpen  DivisionId  SortOrder
4           Open    3e696c          1       34          1
5           Closed  3e696c          0       34          2
1           Open    3e696c          1       35          1
2           Closed  3e696c          0       35          2

列に番号を付ける必要がある方法で列を並べ替える必要がある SQL クエリ:

select  StatusId, Status, DisplayColor, IsOpen, DivisionId, SortOrder
from    TV_Statuses s
order by DivisionId, IsOpen desc

DivisionId と IsOpen によって、SortOrder をインクリメンタルに割り当てて割り当てることができるスクリプトを作成しようとしています。したがって、ここでは、4 の STatusId の SortOrder は 1 になります。5 の StatusId は、SortOrder 2 になります。下の 2 行についても同じですが、ここでは、1 つの部門に 100 行、70 行が開いていて、30 行が閉じている可能性があるため、開いている行には 1 の番号が付けられます。 - 70 で、Closed は 71 - 100 になります。

カーソルに頼らずにこれを行う方法に関するアドバイスはありますか? 私の賢明な感覚は、おそらくもっと簡単な方法があると言っています。

任意の支援をいただければ幸いです。

編集: OK、実際にデータベースでは、SortOrder 列には NULL しかありません。SortOrder 列を更新して、各部門 (DivisionId を使用) の番号が SortOrder で増加するようにします。たとえば、上記の 34 の DivisioniId は、1 つの IsOPen = 1 と 1 つの IsOpen = 0 の行でなければなりません。したがって、これらの 2 つの行をそれぞれ SortOrder 1 と 2 で並べ替えたいと思います。ただし、部門には 10 行を含めることができます。次に、その部門の SortOrder フィールドは 1、2、3、4、5、6、7、8、9、10 になります。説明するのは難しいですが、うまくいけば少しは役に立ちます。

4

1 に答える 1

2

ROW_NUMBER()SQL Server 2005 以降、セット (またはサブセット、しばしばパーティションと呼ばれますが、テーブル パーティションと混同しないでください) のようなウィンドウ関数を適用できます。あなたが探しているものは次のとおりだと思います:

SELECT 
  StatusId, Status, DisplayColor, IsOpen, DivisionId, 
  SortOrder = ROW_NUMBER() OVER 
    (PARTITION BY DivisionId ORDER BY IsOpen DESC, StatusId)
FROM dbo.TV_Statuses AS s
ORDER BY DivisionId, IsOpen DESC;
于 2013-02-04T21:59:01.220 に答える