2016-11-08 9 views
0

ここに、私のテーブルの出力があります。 EmpIDとSegmentTypeの順序は、グループごとに3つ以上のSegmentTypeが存在し、グループあたり15個以下のレコードが存在しない限り重要ではありません。グループあたり3つのグループとグループあたり15行以上のグループ

EmpID | WorkSegment | Group(What I'm trying to update) | 
    ------| ----------- | --------------------------------- | 
    123 | yard  | 1         | 
    245 | yard  | 1         | 
    478 | yard  | 1         | 
    584 | remote  | 1         | 
    321 | remote  | 1         | 
    879 | remote  | 1         | 
    747 | office  | 1         | 
    412 | office  | 1         | 
    251 | office  | 1         | 
    755 | support  | 1         | 
    963 | support  | 1         | 
    369 | support  | 1         | 
    977 | intern  | 1         | 
    888 | intern  | 1         | 
    552 | intern  | 1         | 
    225 | sales  | 2         | 
    332 | sales  | 2         | 
    357 | sales  | 2         | 
    753 | yard  | 2         | 

これまでのコードは次のとおりです。これはグループあたり3つのWorkSegmentsの最初の目標を達成しましたが、今ではグループあたりわずか15行の制限を追加する必要があります。何か案は?

--Create table of distinct SegmentType 
Select distinct SegmentType 
into Work_DistinctSegmentTypes 
from Work_AllData 

Alter table Work_DistinctSegmentTypes 
Add  RowID INT IDENTITY(1, 1) NOT NULL 


--Procedure to update group column 
DECLARE @CurrentRowID INT, 
     @MaxRowID INT, 
     @SegmentType varchar(50) 

SET @CurrentRowID = 1 
SET @MaxRowID = (Select max(rowID) from Work_DistinctSegmentTypes) 


WHILE @CurrentRowID <= @MaxRowID 

BEGIN 
    Set @SegmentType = (Select SegmentType from Work_DistinctSegmentTypes Where RowID = @CurrentRowID) 

    Update Work_AllData 
    SET  [Group] =(RowNum - (1))/3 + 1 
    FROM  (SELECT EmpID,ROW_NUMBER() OVER (ORDER BY EmpID) AS RowNum 
      FROM Work_AllData 
      Where SegmentType = @SegmentType) st, Work_AllData 
      Where st.EmpID = Work_AllData.EmpID 

SET @CurrentRowID = @CurrentRowID + 1 


END 
+0

予想される出力を表示できますか? –

+0

こんにちは、ようこそ。あなたが本当に助けることができるように、より多くの情報が必要です。これは始めるのに最適な場所です。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

Partition By文を追加する必要があるかのように見えます。行番号を入力すると、 'RowNumber <= 15'のどこに記述できるのでしょうか。 –

答えて

0

再帰的CTEは、必要なグループ化間隔を提供できます。

Work_AllDataテーブルにID列がまだない場合は追加する必要があります。

alter table Work_AllData 
add RowID int identity(1, 1) 

次に、間隔を定義して再帰的なCTEを設定できます。

declare @maxGroupMembers int = 15 --max number of members per group 

declare @countEmployees int 
select @countEmployees = max(WAD.RowID) --count of employees 
from Work_AllData WAD 

;with baseSet as (
    select 1 groupMember, 
     1 RowID, 
     1 [Group] 

    union all 

    select case 
      when BS.groupMember = @maxGroupMembers --When max number of members per group is met 
       then 1 --reset counter 
      else BS.groupMember + 1 --otherwise keep counting up members in group 
     end groupMember, 
     BS.RowID + 1 RowID, --cycle through employees by a increment of 1 
     case 
      when BS.groupMember = @maxGroupMembers --When max number of members per group is met 
       then BS.[Group] + 1 --skip to the next group 
      else BS.[Group] --otherwise assign members to current group 
     end [Group] 
    from baseSet BS --Apply against results of current CTE 
    where BS.RowID < @countEmployees) --Stop Recursion at max number of employees 
update WAD 
set WAD.[Group] = BS.[Group] --Update member group 
from Work_AllData WAD 
join baseSet BS 
    on WAD.RowID = BS.RowID --by employee identity column 

Option (maxrecursion 200) --must be manually set high enough to include all employees 
関連する問題