将一组值分隔为A或B(1或2)SQL

时间:2017-05-04 09:43:29

标签: sql-server

注意:我已经问了一个类似的问题,但是在工具有很多组件的事实中省略了一个关键部分。

我有一个包含型号的多个工具及其组件的列表。我想根据它所属的模型对每个第二个工具进行分组。

derivedColumn是我想要返回的查询

declare @t table (Model int, toolID INT ,Component INT,DerivedColumn int);
insert into @t values (1,1,1,1),(1,1,2,1),(1,1,3,1),(1,2,1,2),(1,2,2,2),(1,2,3,2),(1,3,1,1),(1,3,2,1),(1,3,3,1),(1,4,1,2),(1,4,2,2),(1,4,3,2),(1,5,1,1),(1,5,2,1),(1,5,3,1),(2,1,1,1),(2,1,2,1),(2,2,1,2),(2,2,2,2),(2,3,1,1),(2,3,2,1)


SELECT * FROM @t

Model   toolID  Component   DerivedColumn
1       1       1           1
1       1       2           1
1       1       3           1
1       2       1           2
1       2       2           2
1       2       3           2
1       3       1           1
1       3       2           1
1       3       3           1
1       4       1           2
1       4       2           2
1       4       3           2
1       5       1           1
1       5       2           1
1       5       3           1
2       1       1           1
2       1       2           1
2       2       1           2
2       2       2           2
2       3       1           1
2       3       2           1

属于模型的每个第二个工具都应该有一个替代组号。

我相信我必须使用Windows功能,但无法解决。

2 个答案:

答案 0 :(得分:1)

您可以使用dense_rank()mod function %2来计算

DECLARE @SampleData AS TABLE
(
   Model int, 
   ToolId int,
   Component int
)

INSERT INTO @SampleData
(
   Model, ToolId, Component
)
VALUES
(1, 1, 1),(1, 1, 2),(1, 1, 3),(1, 2, 1),
(1, 2, 2),(1, 2, 3),(1, 3, 1),(1, 3, 2),
(1, 3, 3),(1, 4, 1),(1, 4, 2),(1, 4, 3),
(1, 5, 1),(1, 5, 2),(1, 5, 3),(2, 1, 1),
(2, 1, 2),(2, 2, 1),(2, 2, 2),(2, 3, 1),
(2, 3, 2)

SELECT *,
     CASE (dense_rank() OVER(PARTITION BY sd.Model ORDER BY sd.ToolId) + 1) % 2
         WHEN 1 THEN 2
         WHEN 0 THEN 1
     END as  DerivedColumn
FROM @SampleData sd
ORDER BY sd.Model, sd.ToolId

演示链接:http://rextester.com/LIQL79881

答案 1 :(得分:0)

希望它可以帮到你

DECLARE @T TABLE (Model INT, toolID INT ,Component INT,DerivedColumn INT);
INSERT INTO @T VALUES (1,1,1,1),(1,1,2,1),(1,1,3,1),(1,2,1,2),(1,2,2,2),(1,2,3,2),(1,3,1,1),(1,3,2,1),(1,3,3,1),(1,4,1,2),(1,4,2,2),(1,4,3,2),(1,5,1,1),(1,5,2,1),(1,5,3,1),(2,1,1,1),(2,1,2,1),(2,2,1,2),(2,2,2,2),(2,3,1,1),(2,3,2,1)

SELECT Model
      ,toolID
      ,ROW_NUMBER()Over(Partition by toolID order by Model) AS AlternativetoolID
      ,Component
      ,DerivedColumn
from @t;